您的位置:首页 > 其它

HDU-1059-Dividing

2013-07-06 20:51 155 查看
经典的背包问题,看了背包九讲以后做的,这个题是个多重背包,需要转换为01背包

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=120001;
int dp[maxn],a[7],sum;
void CompletePack(int cost)
{
for(int i=cost;i<=sum;i++)
dp[i]=max(dp[i-cost]+cost,dp[i]);
}
void ZeroOnePack(int cost)
{
for(int i=sum;i>=cost;i--)
dp[i]=max(dp[i-cost]+cost,dp[i]);
}
void Multiplay(int cost,int amount)
{
if(cost*amount>=sum)
CompletePack(cost);
else
{
int k=1;
while(k<amount)
{
ZeroOnePack(k*cost);
amount-=k;
k<<=1;
}
}
ZeroOnePack(amount*cost);
}
int main()
{
int cas=1;
while(scanf("%d",&a[1])!=EOF)
{
sum=a[1];
memset(dp,0,sizeof(dp));
for(int i=2;i<=6;i++)
{
scanf("%d",&a[i]);
sum+=a[i]*i;
}
if(!sum)
break;
printf("Collection #%d:\n",cas++);
if(sum&1)
printf("Can't be divided.\n");
else
{
sum/=2;
for(int i=1;i<=6;i++)
Multiplay(i,a[i]);
if(dp[sum]==sum)
printf("Can be divided.\n");
else
printf("Can't be divided.\n");
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: