G. 4.奶牛(二进制枚举)
农民JOHN以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。
给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。
维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。
Input
第1行:一个整数V(1≤V≤25),表示需要的维他命的种类数。
第2行:V个整数(1≤每个数≤1000),表示牛每天需要的每种维他命的最小量。
第3行:一个整数GG(1≤G≤15),表示可用来喂牛的饲料的种数。
下面G行,第n行表示编号为n饲料包含的各种维他命的量的多少。
Output
输出只有一行,包括牛必需的最小的饲料种数P后面有P个数,表示所选择的饲料编号(按从小到大排列)。
如果有多个解,输出饲料序号最小的(即字典序最小)。
Samples
Source
石光中学 FCS2018基础班day 6
这个题就是一个二进制枚举,就是他要求字典序最小,那就是你二进制枚举的数越大越好,
#include<iostream> #include<algorithm> #include<queue> using namespace std; const int maxn=1e3+100; int vv[maxn]; int g[maxn][maxn]; int vis[maxn]; int main(){ int v; cin>>v; for(int i=0;i<v;i++){ cin>>vv[i]; } int t; cin>>t; for(int i=0;i<t;i++){ for(int j=0;j<v;j++){ scanf("%d",&g[i][j]); } } int ans=0x3f3f3f3f; int p; for(int i=1;i<(1<<t);i++){ int z=0; for(int j=0;j<v;j++){ vis[j]=0; } for(int j=0;j<t;j++){ if((i>>j)&1){ z++; for(int k=0;k<v;k++){ vis[k]+=g[j][k]; } } } int flag=1; for(int j=0;j<v;j++){ if(vis[j]<vv[j]){ flag=0; break; } } if(flag){ if(ans>z){ ans=z; p=i; } } } cout<<ans<<" "; for(int i=0;i<t;i++){ if((p>>i)&1){ cout<<i+1<<" "; } } }