hdu_1059

来源:互联网 发布:网络销售开发客户思路 编辑:程序博客网 时间:2024/05/13 23:45
/* * 使用二进制优化,普通多重背包超时 * The use of binary optimization, ordinary multiple backpack timeout*/#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAXTYPE7#define MAXN120001int 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_JUDGEfreopen("test.in", "r", stdin);#endifint 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;}

原创粉丝点击