您的位置:首页 > 其它

hdu 1059 练习练习dp(多重背包)

2013-07-04 13:52 337 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059

经典的多重背包问题,有若干个数,每个数可以取若干个,求问能不能取到总和的一半

直接把模板一敲就差不多了~

#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int size = 600000;
int sum;
int dp[size];
void zeroOnePack(int cost,int weight)
{
int i;
for(i=sum;i>=cost;i--)
dp[i] = max(dp[i],dp[i-cost]+weight);
}
void completePack(int cost,int weight)
{
int i;
for(i=cost;i<=sum;i++)
dp[i]=max(dp[i],dp[i-cost]+weight);
}
void MultiPack(int cost,int weight,int count)
{
int i=1;
if(cost*count>=sum)
{
completePack(cost,weight);
return ;
}
while(i<count)
{
zeroOnePack(cost*i,weight*i);
count-=i;
i<<=1;
}
zeroOnePack(cost*count,weight*count);
}
int main()
{
int num[7],no=1,i;
while(1)
{
sum = 0;
for(int i=1;i<7;i++)
{
cin>>num[i];
sum+=num[i]*i;
}
if(!sum)
break;
if(sum&1)
cout<<"Collection #"<<no++<<":"<<endl<<"Can't be divided."<<endl<<endl;
else
{
sum>>=1;
for(i=0;i<=sum;i++)
dp[i] = 0;
for(i=1;i<7;i++)
if(num[i])
MultiPack(i,i,num[i]);
if(dp[sum]==sum)
cout<<"Collection #"<<no++<<":"<<endl<<"Can be divided."<<endl<<endl;
else
cout<<"Collection #"<<no++<<":"<<endl<<"Can't be divided."<<endl<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: