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);
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#include<string.h>
int a[7];
int f[120005];
int v,k;
void ZeroOnePack(int cost,int weight)//cost 为费用, weight 为价值
{
for(int i=v;i>=cost;i--)
if(f[i-cost]+weight>f[i]) f[i]=f[i-cost]+weight;
}
void CompletePack(int cost,int weight)
{
for(int i=cost;i<=v;i++)
if(f[i-cost]+weight>f[i]) f[i]=f[i-cost]+weight;
}
void MultiplePack(int cost ,int weight,int amount)
{
if(cost*amount>=v) CompletePack(cost,weight);
else
{
for(int k=1;k<amount;)
{
ZeroOnePack(k*cost,k*weight);
amount-=k;
k<<=1;
}
ZeroOnePack(amount*cost,amount*weight);
}
}
int main()
{
int tol;
int iCase=0;
while(1)
{
iCase++;
tol=0;
for(int i=1;i<7;i++)
{
scanf("%d",&a[i]);
tol+=a[i]*i;//总价值数
}
if(tol==0) break;
if(tol%2==1)
{
printf("Collection #%d:\nCan't be divided.\n\n",iCase);
continue;
}
else
{
v=tol/2;
memset(f,0,sizeof(f));
for(int i=1;i<7;i++)
MultiplePack(i,i,a[i]);
if(f[v]==v)
printf("Collection #%d:\nCan be divided.\n\n",iCase);
else printf("Collection #%d:\nCan't be divided.\n\n",iCase);
}
}
return 0;
}