题目描述
农民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=30; int read(){ int x=0,f=1;char ch=getchar(); while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;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=1;i<=n;i++) if(now[i]<v[i])return 0; return 1; } 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=1;j<=n;j++)now[j]+=w[i][j]; cpy[res]=i; DFS(res+1,i+1); for(int j=1;j<=n;j++)now[j]-=w[i][j]; } return; } int main(){ n=read(); int i,j; for(i=1;i<=n;i++)v[i]=read(); g=read(); for(i=1;i<=g;i++) for(j=1;j<=n;j++) w[i][j]=read(); DFS(1,1); printf("%d ",rans-1); for(i=1;i<rans;i++)printf("%d ",ans[i]); return 0; }
时间: 2024-10-18 15:39:03