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){
24         if(s&(1<<i)){
25             k++;
26             yy.push_back(i+1);
27             for(int j=0;j)
28                 res[j]+=g[i][j];
29         }
30     }
31     int flag=0;
32     for(int i=0;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){
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)
53         cin>>v[i];
54     cin>>G;
55     for(int i=0;i)
56         for(int j=0;j)
57             cin>>g[i][j];
58     ans=INF;
59     for(int x=0;x<(1<){
60         solve(x);
61     }
62     cout<" ";
63     for(int i=0;i){
64         if(i==num.size()-1)
65             cout<endl;
66         else
67             cout<" ";
68     }
69     return 0;
70 }
View Code

 

转载于:https://www.cnblogs.com/wolf940509/p/7144603.html

你可能感兴趣的:(Healthy Holsteins)