悲剧啊!这么简单的题想了一天愣是没想到,枚举就可以了…………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

浙公网安备 33010602011771号