hdu 1059 多重背包 二进制优化 (完全 , 01)背包结婚

来源:互联网 发布:交换机修改telnet端口 编辑:程序博客网 时间:2024/06/06 13:20
 
#include<stdio.h>int dp[120005];int V,v;void bag01(int c,int w){for(v=V;v>=c;v--){if(dp[v]<dp[v-c]+w)dp[v] = dp[v-c]+w;}}void bagall(int c,int w){for(v=c;v<=V;v++){if(dp[v]<dp[v-c]+w)dp[v]=dp[v-c]+w;}}void mutibag(int c,int w,int p){if(c*p>=V)bagall(c,w);else{int k=1;while(k<p){bag01(c*k,w*k);p-=k;k+=k;}bag01(c*p,w*p);}}int main(){int n[8];int i;int sum;int p = 0;while(scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6]),n[1]+n[2]+n[3]+n[4]+n[5]+n[6]){sum = n[1]+n[2]*2+n[3]*3+n[4]*4+n[5]*5+n[6]*6;if(sum%2){printf("Conllection #%d:\nCan't be divided.\n\n",++p);continue;}V=sum/2;for(i=0;i<=V;i++)dp[i] = 0;        for(i=0;i<=6;i++)mutibag(i,i,n[i]);if(dp[V]==V)printf("Collection #%d:\nCan be divided.\n\n",++p);elseprintf("Collection #%d:\nCan't be divided.\n\n",++p);}}

原创粉丝点击