您的位置:首页 > 其它

hdu 1059 Dividing(多重背包)

2012-04-30 08:10 363 查看
题目:很六种岩石,每种的价值为1.2.3.4.5.6,每种的个数n[i],吧这些岩石分成两半,如果能分成价值相等的两半输出Can be divided.否则输出Can‘t
be divided.

分析:如果价值总和为奇数,直接输出can't,否则用V做总价值的一半,当做背包容量,再拿价值当做背包的体积,就是很明显的多重背包....

注意: wa了好几次,就是因为OneZeroPack(int k*cost,int
k*weight)没注意,吧k弄丢了



#include<iostream>
#include<cstdio>
using namespace std;
int dp[150000];
int main()
{
int n[10],ca=1;
while(1)
{
int sum=0,V=0;
for(int i=1;i<=6;i++)
{
scanf("%d",&n[i]);
sum+=n[i];
V+=n[i]*i;
}
if(sum==0)
break;
if(V%2==1)
{
printf("Collection #%d:\nCan't be divided.\n\n",ca++);
continue;
}
V=V/2;
memset(dp,0,sizeof(dp));
for(int i=1;i<=6;i++)
if(n[i]!=0)
{
if(n[i]*i>=V)
{
for(int j=i;j<=V;j++)
dp[j]=max(dp[j],dp[j-i]+i);
}
else
{
int k=1;
while(k<n[i])
{
for(int j=V;j>=k*i;j--)//是k*i不是i
dp[j]=max(dp[j],dp[j-k*i]+k*i);
n[i]-=k;
k*=2;
}
for(int j=V;j>=n[i]*i;j--)
dp[j]=max(dp[j],dp[j-n[i]*i]+n[i]*i);
}

}
if(dp[V]==V)
printf("Collection #%d:\nCan be divided.\n\n",ca++);
else
printf("Collection #%d:\nCan't be divided.\n\n",ca++);

}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: