Healthy Holsteins

链接

分析:因为数据范围比较小,我们可以通过二进制枚举子集,然后找出所需饲料种数最小的并记录下来,同时记录一下路径,也就是字典序最小的

 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 }
View Code

 

posted @ 2017-07-10 10:34  wolf940509  阅读(138)  评论(0)    收藏  举报