您的位置:首页 > 其它

HDU-1059 Dividing 多重背包

2013-07-25 21:19 323 查看
啊!这题本来很简单,就是不细心,搞的我wa五六次啊,严重受到打击啊!多重背包转化成01背包和完全背包就可以了。

这个题,是说能分成开不,那么两个人所拥有的价值是总价值的一半。把背包的容量刚好看成总价的的一半v(本来可以看成无限大)但没必要,因为它刚好用v的体积。那么就是,在容量为v的条件下,看能否把背包装满。这样就可以用多重背包实现了。

#include<stdio.h>
#include<string.h>
#define max(a,b)(a)>(b)?(a):(b)
int dp[60005];
int v;
inline void zero_pack(int c,int w)
{
for(int i=v;i>=c;i--)
dp[i]=max(dp[i],dp[i-c]+w);
}

void comp_pack(int c,int w)
{
for(int i=c;i<=v;i++)
dp[i]=max(dp[i],dp[i-c]+w);
}

void Mult_pack(int c,int w,int m)
{
if(c*m>=v) comp_pack(c,w);
else{
for(int k=1;k<m;k<<=1){
zero_pack(k*c,k*w);
m-=k;
}
zero_pack(c*m,w*m);
}
}

int main()
{
int a[7],cas=0;
while(1){
v=0;
cas++;
for(int i=1;i<7;i++){
scanf("%d",&a[i]);
v+=a[i]*i;
}
if(!v) break;
if(v&1){
printf("Collection #%d:\nCan't be divided.\n\n",cas);
continue;
}
v>>=1;
memset(dp,0,sizeof(dp));
for(int i=1;i<7;i++)
Mult_pack(i,i,a[i]);
if(dp[v]==v)
printf("Collection #%d:\nCan be divided.\n\n",cas);
else
printf("Collection #%d:\nCan't be divided.\n\n",cas);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息