您的位置:首页 > 其它

POJ 1014 Dividing 多重背包

2013-08-29 10:36 197 查看
让物体的重量等于价值,用总价值的一半的包去装这些物品,看其是否能装满




View Code

#include<stdio.h>
#include<string.h>
int dp[120005], a[8];
int max(int a, int b) { return a > b ? a : b;}
int main()
{
int i, j, cas = 1, n, m;
while( ~scanf("%d", &a[1]) )
{
int sum = a[1];
for(i = 2; i <= 6; i++)
{
scanf("%d", &a[i]);
sum += i * a[i];
}
if(!sum) break;
printf("Collection #%d:\n", cas++);

if(sum & 1) { printf("Can't be divided.\n\n");continue; }
sum >>= 1;
memset(dp, 0, sizeof(dp));
for(i = 1; i <= 6; i++)
{
if(i * a[i] >= sum)
for(j = i; j <= sum; j++)
dp[j] = max(dp[j], dp[j-i]+i);
else
{
int k = 1;
while(k < a[i])
{
for(j = sum; j >= i*k; j--)
dp[j] = max(dp[j], dp[j-i*k]+i*k);
a[i] -= k;
k <<= 1;
}
for(j = sum; j >= i*a[i]; j--)
dp[j] = max(dp[j], dp[j-i*a[i]]+i*a[i]);
}
if(dp[sum] == sum) break;
}
if(dp[sum] == sum) printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: