题意为有一头牛,它每天所需的维生素有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来判断取不取。