题目描述
农民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
做了好久做不出来,在精髓那里卡住,弱鸡求过,也是暴力搜索,数据之间的转换有点复杂,有点动归的思想
#include<bits/stdc++.h>
using namespace std;
int species,mix[30],Min[30];
//维生素种类,维生素标准,运算中维生素的和 (用来和维生素标准比较 )
int n,fodder[20][30],k=0,t=50;
//n中食物,第[n]中食物含有的第[i]中维生素为为fodder[n][i],
//k为运算中的食物种类,t为最终的食物种类
int ans[20],output[20];
//运算中的食物种类,最终输出的食物种类
bool juge() //用来判断是否满足条件
{
for(int i=0;i<species;i++)
if(Min[i]<mix[i]) return false;
return true;
}
void search(int x)
{
if(juge())
{ //这里是精髓,
if(k<t)
{
t=k;
for(int i=0;i<k;i++)
output[i]=ans[i];
}
return ;
}
if(x==n) return ;
for(int i=0;i<species;i++) //对于第x种食物,选择拿
Min[i]+=fodder[x][i];
ans[k++]=x;
search(x+1);
for(int i=0;i<species;i++)//选择不拿
Min[i]-=fodder[x][i];
k--;
search(x+1);
}
int main()
{
cin>>species;
for(int i=0;i<species;i++)
cin>>mix[i];
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<species;j++)
cin>>fodder[i][j];
search(0);
cout<<t<<' ';
for(int i=0;i<t;i++)
cout<<output[i]+1<<' ';
return 0;
}