您的位置:首页 > 其它

HDU 1059 Dividing(多重背包)

2016-03-27 10:52 357 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1059

思路:简单多重背包,按照题目数据开的数组,结果RE了,果断开大,直接过了

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int a[10];
int dp[100100];
int sum;
void complete_pack(int value)
{
for(int i=value; i<=sum; i++)
dp[i] = max(dp[i],dp[i-value]+value);
}
void zeroone_pack(int value)
{
for(int i=sum; i>=value; i--)
dp[i] = max(dp[i],dp[i-value]+value);
}
void multi_pack()
{
for(int i=1; i<=6; i++)
{
if(a[i] * i >= sum)
complete_pack(i);
else
{
int k = 1;
int count1 = a[i];
while(k < count1)
{
zeroone_pack(k*i);
count1 -= k;
k *= 2;
}
zeroone_pack(count1*i);
}
}
}
int main()
{
int cas = 1;
while(true)
{
sum = 0;
memset(dp,0,sizeof(dp));
for(int i=1; i<=6; i++)
{
scanf("%d",&a[i]);
sum += (a[i] * i);
}
if(sum == 0)
break;
printf("Collection #%d:\n",cas++);
if(sum & 1)
{
printf("Can't be divided.\n\n");
continue;
}
sum /= 2;
multi_pack();
if(dp[sum] == sum)
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: