hdu 1059 多重背包 背包指数分块
思路:
这个方法要看《浅谈几类背包问题》这篇论文。
#include"stdio.h" #define Max(a,b) (a)>(b)?(a):(b) int f[31],k[8]; int main() { int i,j,m,Case=0; while(scanf("%d%d%d%d%d%d",&k[1],&k[2],&k[3],&k[4],&k[5],&k[6])!=EOF,k[1]|k[2]|k[3]|k[4]|k[5]|k[6]) { for(i=0;i<=30;i++) f[i]=0; int sum=k[1]+k[2]*2+k[3]*3+k[4]*4+k[5]*5+k[6]*6; sum%=60; int c=sum/2; if(sum%2!=0) { printf("Collection #%d:\nCan't be divided.\n\n",++Case); continue; } for(i=1;i<=6;i++) { m=1; if(k[i]==0) continue; while(k[i]>0) { if(k[i]<m) m=k[i]; k[i]-=m; for(j=c;j>=m*i;j--) { f[j]=Max(f[j],f[j-m*i]+i*m); } m*=2; } } if(f[c]==c) printf("Collection #%d:\nCan be divided.\n\n", ++Case); else printf("Collection #%d:\nCan't be divided.\n\n",++Case); } return 0; }