更正了自己对多重背包的错误处理方法——有收获!
在把多重背包划归成0-1背包时要注意划分方法。
/*
* HDU-1058 dividing
* mike-w
* 2011-10-5
* -----------------
* 多重背包
* 原来我对多重背包的处理一直有误, 今日才发现!
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define MAXW 500000
#define MARBLE 10
long opt[MAXW];
long v[MARBLE],c[MARBLE];
long read(void)
{
long sum=0,i;
for(i=1;i<=6;i++)
{
scanf("%ld",c+i);
v[i]=i;
sum+=c[i]*i;
}
return sum;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("1059.in","r",stdin);
#endif
long sum,tsum,i,j,k,t;
long cnt=0;
while((sum=read()))
{
cnt++;
for(i=0;i<=sum;i++)
opt[i]=-1;
opt[0]=0;
printf("Collection #%ld:\n",cnt);
if(sum&0x1)
{
puts("Can\'t be divided.\n");
continue;
}
sum/=2;
tsum=sum;
for(i=1;i<=6;i++)
{
for(j=1;j<c[i];c[i]-=j,j<<=1)
for(k=sum;k>=v[i]*j;k--)
if(opt[k-v[i]*j]>=0 && opt[k]<opt[k-v[i]*j]+v[i]*j)
opt[k]=opt[k-v[i]]+v[i]*j;
if(!c[i]) continue;
for(k=sum;k>=v[i]*c[i];k--)
if(opt[k-v[i]*c[i]]>=0 && opt[k]<opt[k-v[i]*c[i]]+v[i]*c[i])
opt[k]=opt[k-v[i]]+v[i]*c[i];
}
if(opt[sum]!=-1)
puts("Can be divided.\n");
else
puts("Can\'t be divided.\n");
}
return 0;
}
5万+

被折叠的 条评论
为什么被折叠?



