您的位置:首页 > 其它

HDU - 1059 多重背包模板题

2017-08-09 16:21 134 查看
题意:有价值为1,2,3,4,5,6的物品,每种物品都有一定数量,问这些物品能不能平分成价值相同的两份;

思路:多重背包模板题,以价值总额的一半为背包容量

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<vector>
#include<cstdio>
#define MAXN 33000
#define INF 0x3f3f3f3f
#define lmid l,m,rt<<1
#define rmid m+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1
#define Mod 1000000007
#define i64 __int64
#define LIMIT_ULL 100000000000000000
using namespace std;
int dp[60005];
int a[10];
void dc(int v,int w,int sum)
{
if(v*w>=sum)
{
for(int i=w;i<=sum;i++)
{
dp[i]=max(dp[i],dp[i-w]+w);
}
}
else
{
int k=1;
while(k<v)
{
for(int i=sum;i>=k*w;i--)
{
dp[i]=max(dp[i],dp[i-k*w]+k*w);
}
v-=k;
k*=2;
}
k=v;
for(int i=sum;i>=k*w;i--)
{
dp[i]=max(dp[i],dp[i-k*w]+k*w);
}
}
}
int main()
{
int ca=1;
while(1)
{
int flag=0;
int sum=0;
for(int i=1;i<=6;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)
flag++;
sum+=a[i]*i;
}
if(flag==6)
break;
if(sum%2)
{
printf("Collection #%d:\n",ca++);
cout<<"Can't be divided."<<endl<<endl;
continue;
}
memset(dp,0,sizeof(dp));
sum/=2;
for(int i=1;i<=6;i++)
{
dc(a[i],i,sum);
}
if(dp[sum]==sum)
{
//cout<<dp[sum]<<endl;
printf("Collection #%d:\n",ca++);
cout<<"Can be divided."<<endl;
}
else
{
printf("Collection #%d:\n",ca++);
cout<<"Can't be divided."<<endl;
}
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: