hdu1059 Dividing

题目:

      http://acm.hdu.edu.cn/showproblem.php?pid=1059

 或  http://poj.org/problem?id=1014 

 

 

多重背包,注意(比较大小)要用手写,不要调函数,在hdoj上交,会发现时间花费很大 

 

#include <stdio.h> int dp[120005]; int V,v; //01背包, c表示花费, w表示价值 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; } //完全背包,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; } //多重背包,c表示花费, w表示价值,p表示个数 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; //sum为奇数个,那么肯定不能平分 if(sum%2) { printf("Collection #%d:/nCan't be divided./n/n",++p); continue; } V=sum/2; // 对总数的一半进行背包 for(i=0;i<=V;i++) dp[i]=0; //初始化 for(i=1;i<=6;i++) mutibag(i,i,n[i]); //进行多次背包 if(dp[V]==V) printf("Collection #%d:/nCan be divided./n/n",++p); else printf("Collection #%d:/nCan't be divided./n/n",++p); } }  

你可能感兴趣的:(c,c)