/*
* 使用二进制优化,普通多重背包超时
* The use of binary optimization, ordinary multiple backpack timeout
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXTYPE 7
#define MAXN 120001
int dp[MAXN], cnt[MAXTYPE];
void complete_knapsack(int max_v, int v)
{
for(int i = 0; i <= max_v-v; i ++) {
if( dp[i] ) {
dp[i+v] = 1;
}
}
}
void zero_one_knapsack(int max_v, int v)
{
for(int i = max_v; i >= v; i --) {
if( dp[i-v] ) {
dp[i] = 1;
}
}
}
int can_divided(int max_v)
{
int binary, tot;
memset(dp, 0, sizeof(dp)); dp[0] = 1;
for(int i = 1; i < MAXTYPE; i ++) {
if( cnt[i]*i >= max_v ) {
complete_knapsack(max_v>>1, i);
}
else {
binary = 1; tot = cnt[i];
while( binary < tot ) {
zero_one_knapsack(max_v>>1, binary*i);
tot -= binary;
binary <<= 1;
}
zero_one_knapsack(max_v, tot*i);
}
}
for(int v = max_v>>1; v >= 0; v --) {
if( dp[v] && 2*v == max_v ) {
return 1;
}
}
return 0;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int cas(1), max_v;
while( true ) {
max_v = 0;
for(int i = 1; i < MAXTYPE; i ++) {
scanf("%d", &cnt[i]);
max_v += i*cnt[i];
}
if( !max_v ) {
break;
}
printf("Collection #%d:\n", cas ++);
if( can_divided(max_v) ) {
printf("Can be divided.\n\n");
}
else {
printf("Can't be divided.\n\n");
}
}
return 0;
}
hdu_1059
最新推荐文章于 2019-05-20 10:47:33 发布