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;
}
就是给出每个数的个数,问这些数能不能分成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;
}
相关文章推荐
- HDU-1059-Dividing-wust9(背包)
- HDU 1059 Dividing(多重背包)
- hdu 1059 Dividing(多重背包)
- hdu1059 Dividing 我的ACM我的梦,回顾篇 完全背包
- HDU 1059 Dividing 多重背包
- hdu 1059 Dividing(二进制转化优化) 分组背包
- 【背包专题】G - Dividing hdu 1059【多重背包】
- hdu1059 Dividing(完全背包)
- (step3.3) hdu 1059(Dividing——多重背包)
- hdu1059 Dividing (多重背包) 经典
- hdu 1059 Dividing 多重背包
- HDU 1059 Dividing(多重背包)
- HDU 1059 Dividing(多重背包二进制优化)
- hdu 1059 Dividing 多重背包
- Hdu 1059 Dividing -- 多重背包
- hdu 1059 Dividing(优化的多重背包 可达可不达)
- HDU 1059 Dividing 分配(多重背包,母函数)
- HDU——1059 Dividing(多重背包+二进制优化)
- Dividing (hdu 1059 多重背包)
- hdu 1059 Dividing 多重背包 超级水题 ★