标签:
题意为有一头牛,它每天所需的维生素有V种,每种维生素的需求量给出,同时给出G种已知的饲料,求如何组合这些饲料可以使得牛获得足够的维生素;
给的数据范围很小,直接暴力枚举所有
/* ID: modengd1 PROG: holstein LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> using namespace std; int V,G,food[15][1000],cow[1000]; int ans1,ans2; int main() { freopen("holstein.in","r",stdin); freopen("holstein.out","w",stdout); scanf("%d",&V); ans1=20; for(int i=0;i<V;i++) scanf("%d",&cow[i]); scanf("%d",&G); for(int i=0;i<G;i++) { for(int j=0;j<V;j++) scanf("%d",&food[i][j]); } int ans=0; bool isfind=false; for(int i=0;i<(1<<G);i++)//枚举所有的饲料组合 { int now[1000]; memset(now,0,sizeof(now)); isfind=true; for(int j=0;j<V;j++)//计算所有的营养 { for(int k=0;k<G;k++)//检查这个饲料喂不喂 { if((1<<k)&i) now[j]+=food[k][j]; } if(now[j]<cow[j])//若i的组合下维生素j不够则跳出 { isfind=false; break; } } if(isfind) { int ans=0,j; j=i; while(j!=0)//获取一共有多少位上是1 { ans++; j-=(j&-j); } if(ans<ans1)//判断是否比以前得到的答案所喂得饲料种类少 { ans1=ans; ans2=i; } } } cout<<ans1; for(int k=0;k<G;k++) { if(1<<k&ans2) cout<<‘ ‘<<k+1; } cout<<endl; return 0; }
饲料的组即可,我使用的是用G位二进制各位上的0和1来判断取不取。
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4779443.html