HDU 1059 Dividing(多重背包)
来源:互联网 发布:工程进度计划软件 编辑:程序博客网 时间:2024/06/14 05:49
多重背包判断 sum 为偶数的时候 sum/2 可达不可达。
还是很简单的。 只要sum/2 那么 sum 一定可以分成两份。
多重背包解决。
#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>#include <cmath>#include <cstdlib>#include <string>#include <map>#include <vector>#include <set>#include <queue>#include <stack>#include <cctype>using namespace std;typedef long long LL;typedef unsigned long long ULL;#define MAXN 10+10#define INF (1<<30)#define mod 123456789int main (){ int a[MAXN] = {0}; int kase = 0; while(true){ int sum = 0; for(int i = 1; i <= 6; i++){ scanf("%d",&a[i]); sum += a[i]*i; } if(!sum) break; printf("Collection #%d:\n",++kase); if(sum & 1){ printf("Can't be divided.\n\n"); continue; } int d[60000+10] = {0}; sum /= 2; for(int i = 1; i <= 6; i++){ if(a[i]*i >= sum){ for(int j = i; j <= sum; j++){ if((j-i > 0 && d[j-i]) || j-i == 0) d[j] = 1; } } else if(a[i]){ int k = a[i]/2; k /= 2; int j; for(j = 1; j <= k; j=(j<<1)){ for(int z = sum; z >= j*i; z--){ if((z-i*j > 0 && d[z-i*j]) || z-i*j == 0) d[z] = 1; } } int x = a[i]+1-j; for(int z = sum; z >= i*x; z--){ if((z-i*x > 0 && d[z-i*x]) || z-i*x == 0) d[z] = 1; } } } if(d[sum]) printf("Can be divided.\n"); else printf("Can't be divided.\n"); printf("\n"); } return 0;}
0 0
- hdu 1059 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 多重背包
- hdu 1059 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 多重背包
- edit控件小技巧(mark)
- JavaScript速记4 —— 变量声明和变量作用域
- poj 1734 Sightseeing trip 扩展floyd求最小环
- mySql的连接数据库操作(单例模式)
- tomcat7日志管理--基础知识、配置、以及使用log4j做日志分割
- HDU 1059 Dividing(多重背包)
- ExecutorService
- 基于MKNetworkKit的断点续传
- cluster进程间通讯精简版
- Java中WebService实例
- el表达式
- Java数据类型
- MySQL (3)
- 冒泡排序