Translation
农民 JOHN 以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。
给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。
维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。
PROGRAM NAME: holstein
INPUT FORMAT:(file holstein.in)
第 1 行:一个整数 V(1<=V<=25),表示需要的维他命的种类数。
第 2 行:V 个整数(1<=每个数<=1000),表示牛每天需要的每种维他命的最小量。
第 3 行:一个整数 G(1<=G<=15),表示可用来喂牛的饲料的种数。
下面 G 行,第 n 行表示编号为 n 饲料包含的各种维他命的量的多少。
OUTPUT FORMAT:(file holstein.out)
输出文件只有一行,包括牛必需的最小的饲料种数 P
后面有 P 个数,表示所选择的饲料编号(按从小到大排列)。
如果有多个解,输出饲料序号最小的(即字典序最小)。
Solution
dfs水题,没什么好说的,直接做就好了
Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=25+10;
const int maxm=15+10;
int v[maxn],a[maxm][maxn],p[maxm],sum[maxn];
int n,m,tmp;
int check(){
int flag=0,i,j;
memset(sum,0,sizeof(sum));
for(i=1;i<=m;i++)
if(p[i])
for(j=1;j<=n;j++)
sum[j]+=a[i][j];
for(i=1;i<=n;i++)
if(sum[i]<v[i]){
flag=1;
break;
}
if(flag)return 0;
else return 1;
}
void dfs(int x,int step,int max){
int i,j;
if(x==0 && check()){
printf("%d ",step);
int t=0;
for(i=1;i<=m;i++)
if(t==0 && p[i]){
printf("%d",i);
t=1;
}
else if(p[i])printf(" %d",i);
tmp=1;
puts("");
}
if(tmp)return;
if(x==0)return;
for(i=max+1;i<=m;i++)
if(!p[i]){
p[i]=1;
dfs(x-1,step,i);
p[i]=0;
}
}
int main(){
int i,j,k;
freopen("holstein.in","r",stdin);
freopen("holstein.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
scanf("%d",&m);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=m;i++){
dfs(i,i,0);
if(tmp)break;
}
return 0;
}