您的位置:首页 > 其它

hdu 1059 Dividing 多重背包

2010-07-10 18:57 465 查看
]/*
又是一道多重背包的题目,其实我对于背包还是不懂,但是凭着记忆的动态方程
居然能打出可以AC的代码,还奇怪的
*/
#include <iostream>//00451533 2010-07-10 18:40:39 Accepted 1005 15 MS 412 KB Visual C++ 悔惜晟
#include <cstdio>
#include <cstring>
using namespace std;

const int N = 60005;
int main()
{
int kind[7];
int t = 1;
while(1)
{
int sum = 0;
int val = 0;
for(int i = 1; i <= 6; i++)
{
scanf("%d", &kind[i]);
kind[i] %= 10;// 这句话没有加就TLE
val += i * kind[i];
sum += kind[i];
}
if(sum == 0)
break;
if(val / 2 != val - val / 2)
{
printf("Collection #%d:/n", t++);
printf("Can't be divided./n/n");
continue;
}
int dp
;

memset(dp, 0, sizeof(dp));
for(int i = 1; i <= 6; i++)
for(int j = 1; j <= kind[i]; j++)
for(int k = val / 2; k >= i; k--)
dp[k] = max(dp[k], dp[k - i] + i);

if(dp[val / 2] == val - val / 2)
{
printf("Collection #%d:/n", t++);
printf("Can be divided./n/n");
}
else
{
printf("Collection #%d:/n", t++);
printf("Can't be divided./n/n");

}

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