洛谷P1460 健康的荷斯坦奶牛 Healthy Holsteins

时间:2021-12-03 17:11:08

题目描述

农民JOHN以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。

给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。

维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。

输入输出格式

输入格式:

第1行:一个整数V(1<=V<=25),表示需要的维他命的种类数。

第2行:V个整数(1<=每个数<=1000),表示牛每天需要的每种维他命的最小量。

第3行:一个整数G(1<=G<=15),表示可用来喂牛的饲料的种数。

下面G行,第n行表示编号为n饲料包含的各种维他命的量的多少。

输出格式:

输出文件只有一行,包括

牛必需的最小的饲料种数P

后面有P个数,表示所选择的饲料编号(按从小到大排列)。

如果有多个解,输出饲料序号最小的(即字典序最小)。

输入输出样例

输入样例#1:
4
100 200 300 400
3
50 50 50 50
200 300 200 300
900 150 389 399
输出样例#1:
2 1 3

说明

USACO 2.1

翻译来自NOCOW

又是一道奶牛题。

暴搜就能过

/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int rans=1e9;
int ans[mxn];
int n,v[mxn],g,w[mxn][mxn];
int now[mxn],cpy[mxn];
bool check(){
// for(int i=1;i<=n;i++)printf("%d ",now[i]);
// printf("\n");
for(int i=;i<=n;i++)
if(now[i]<v[i])return ;
return ;
}
void DFS(int res,int pos){
if(res>=rans)return;
if(check()){
rans=res;
memcpy(ans,cpy,sizeof ans);
return;
}
// printf("%d %d\n",res,pos);
for(int i=pos;i<=g;i++){
for(int j=;j<=n;j++)now[j]+=w[i][j];
cpy[res]=i;
DFS(res+,i+);
for(int j=;j<=n;j++)now[j]-=w[i][j];
}
return;
}
int main(){
n=read();
int i,j;
for(i=;i<=n;i++)v[i]=read();
g=read();
for(i=;i<=g;i++)
for(j=;j<=n;j++)
w[i][j]=read();
DFS(,);
printf("%d ",rans-);
for(i=;i<rans;i++)printf("%d ",ans[i]);
return ;
}