您的位置:首页 > 其它

HDU 1059 Dividing 多重背包

2014-08-25 01:23 381 查看
题目大意:

 就是给出每个数的个数,问这些数能不能分成2组,使得两组的和相等

大致思路:

这是一个简单的多重背包问题吧,判断一下和是偶数时的情况下f [ sum / 2 ]是否是true即可

很简单的一道背包题。

代码如下:

Result  :  Accepted     Memory  :  316 KB     Time  :  390 ms

/*
* Author: Gatevin
* Created Time: 2014/8/9 20:37:11
* File Name: hehe.cpp
*/
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
using namespace std;
const double eps(1e-8);
typedef long long lint;

int n;
int tmp;
bool f[60010];
int all;
int main()
{
int t[7];
int cas = 0;
while(~scanf("%d", t + 1))
{
cas++;
for(int i = 2; i <= 6; i++) scanf("%d", t + i);
if(!t[1] &&!t[2] && !t[3] && !t[4] && !t[5] && !t[6]) return 0;
memset(f, 0, sizeof(f));
f[0] = true;
all = 0;
for(int i = 1; i <= 6; i++)
{
all += i*t[i];
}
if(all & 1)
{
printf("Collection #%d:\nCan't be divided.\n\n", cas);
continue;
}
for(int i = 1; i <= 6; i++)
{
int k = 1;
while(k < t[i])
{
for(int j = (all >> 1); j >= k*i; j--)
{
f[j] = f[j] || f[j - k*i];
}
t[i] -= k;
k *= 2;
}
for(int j = (all >> 1); j >= t[i]*i; j--)
{
f[j] = f[j] || f[j - t[i]*i];
}
}
if(f[all >> 1])
{
printf("Collection #%d:\nCan be divided.\n\n", cas);
}
else
{
printf("Collection #%d:\nCan't be divided.\n\n",cas);
}
}

return 0;
}

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