分析:因为数据范围比较小,我们可以通过二进制枚举子集,然后找出所需饲料种数最小的并记录下来,同时记录一下路径,也就是字典序最小的
1 /* 2 PROB:holstein 3 ID:wanghan 4 LANG:C++ 5 */ 6 #include "iostream" 7 #include "cstdio" 8 #include "cstring" 9 #include "string" 10 #include "vector" 11 using namespace std; 12 const int INF=10000; 13 const int maxn=30; 14 int V,G; 15 int v[maxn],g[maxn][maxn]; 16 vector<int> num; 17 int ans; 18 void solve(int s){ 19 int res[maxn]; 20 memset(res,0,sizeof(res)); 21 vector<int> yy; 22 int k=0; 23 for(int i=0;i<G;i++){ 24 if(s&(1<<i)){ 25 k++; 26 yy.push_back(i+1); 27 for(int j=0;j<V;j++) 28 res[j]+=g[i][j]; 29 } 30 } 31 int flag=0; 32 for(int i=0;i<V;i++){ 33 if(res[i]<v[i]){ 34 flag=1; break; 35 } 36 } 37 if(!flag&&k<ans){ 38 ans=k; 39 num.clear(); 40 for(int i=0;i<yy.size();i++){ 41 int tt=yy[i]; 42 num.push_back(tt); 43 } 44 } 45 46 } 47 int main() 48 { 49 freopen("holstein.in","r",stdin); 50 freopen("holstein.out","w",stdout); 51 cin>>V; 52 for(int i=0;i<V;i++) 53 cin>>v[i]; 54 cin>>G; 55 for(int i=0;i<G;i++) 56 for(int j=0;j<V;j++) 57 cin>>g[i][j]; 58 ans=INF; 59 for(int x=0;x<(1<<G);x++){ 60 solve(x); 61 } 62 cout<<ans<<" "; 63 for(int i=0;i<num.size();i++){ 64 if(i==num.size()-1) 65 cout<<num[i]<<endl; 66 else 67 cout<<num[i]<<" "; 68 } 69 return 0; 70 }