悲剧啊!这么简单的题想了一天愣是没想到,枚举就可以了…………dfs也可以,回去再写一遍。深刻的教训!!下面贴出代码,匆忙写出来的,没有优化代码,做个纪念。

View Code
 1 /*{
 2 ID:jzy3209981
 3 PROG:holstein
 4 LANG:C++
 5 }*/
 6 #include<stdio.h>
 7 #include<iostream>
 8 #include<string.h>
 9 #include<math.h>
10 using namespace std;
11 
12 int scoop[15][25];
13 int vitamin[25];
14 
15 int main()
16 {
17     freopen ("holstein.in","r",stdin);
18     freopen ("holstein.out","w",stdout);
19     int v,i,g,j,n,min=15,po,p,state,m;
20     int copy[25];
21     scanf("%d",&v);
22     for(i=0;i<v;i++)
23         scanf("%d",&vitamin[i]);
24     scanf("%d",&g);
25     for(i=0;i<g;i++)
26         for(j=0;j<v;j++)
27             scanf("%d",&scoop[i][j]);
28     
29     for(i=0;i<=((1<<g)-1);i++)
30     {
31         memcpy(copy,vitamin,sizeof(vitamin));
32         po=i;
33         state=0;
34         n=0;
35         for(j=0;j<v;j++)
36             if(copy[j]!=0)
37                 state=1;
38         if(state==0)
39         {
40             if(n<=min)
41                 min=n;
42             continue;
43         }
44         while(po!=0)
45         {
46             p=po&-po;
47             po-=p;
48             state=0;
49             for(j=0;j<v;j++)
50             {                
51                 copy[j]-=scoop[(int)(log((double)p)/log(2))][j];
52                 if(copy[j]>0)
53                     state=1;
54             }
55             n++;        
56         }
57         if(state==0)
58         {
59             if(n<min)
60             {
61                 min=n;
62                 m=i;
63             }
64         }
65     }
66     printf("%d ",min);
67     po=m;
68     while(po!=0)
69     {
70         p=po&-po;
71         po-=p;
72         if(po==0)
73             printf("%d\n",(int)(log((double)p)/log(2)+1));
74         else
75             printf("%d ",(int)(log((double)p)/log(2)+1));
76     }
77 
78 
79         
80 
81     return 0;
82 
83 }
84 
85 
86 
87 
88         
89 
90 
91     

 

posted on 2012-07-21 16:40  醉春雨  阅读(118)  评论(0)    收藏  举报