hdu 1059 Dividing(优化的多重背包 可达可不达)
2014-02-24 19:57
344 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1059
题意:有六种marbles,第i种marbles的价值为i,数量为输入的num[i],两个人想按这些marbles的总价值平分,问他们是否能够平分成功.
思路:和hdu 1171 http://acm.hdu.edu.cn/showproblem.php?pid=1171
类似。能不能平分,可以按总价值的一半进行多重背包,若总价值一半能够到达,说明平分成功,不过这里需要进行优化。直接转化为01背包,TLE。。
题意:有六种marbles,第i种marbles的价值为i,数量为输入的num[i],两个人想按这些marbles的总价值平分,问他们是否能够平分成功.
思路:和hdu 1171 http://acm.hdu.edu.cn/showproblem.php?pid=1171
类似。能不能平分,可以按总价值的一半进行多重背包,若总价值一半能够到达,说明平分成功,不过这里需要进行优化。直接转化为01背包,TLE。。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int dp[60010],use[60010],sum; int num[10]; //优化的多重背包 void solve() { sum = sum>>1; memset(dp,0,sizeof(dp)); dp[0] = 1; for(int i = 1; i <= 6; i++) { if(num[i] > 0) { memset(use,0,sizeof(use)); for(int j = i; j <= sum; j++) { if(dp[j-i] && !dp[j] && use[j-i] < num[i]) { dp[j] = 1; use[j] = use[j-i]+1; } } } } if(dp[sum]) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } int main() { int item = 1; while(~scanf("%d %d %d %d %d %d",&num[1],&num[2],&num[3],&num[4],&num[5],&num[6])) { if(num[1]==0&&num[2]==0&&num[3]==0&&num[4]==0&&num[5]==0&&num[6]==0) break; sum = 0; for(int i = 1; i <= 6; i++) sum += num[i]*i; if(sum%2 != 0) { printf("Collection #%d:\nCan't be divided.\n\n",item++); continue; } else { printf("Collection #%d:\n",item++); solve(); } } return 0; }
相关文章推荐
- Create User
- PIC单片机控制DS18B20在proteux中的测试
- 如何找maven配置的jar包
- URAL 1167. Bicolored Horses(二维dp或者记忆化搜索)
- 求f(x)=1-x的2次方的定积分
- (转)类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
- 关于俄罗斯方块(C/C++中+esayx)
- nginx---模块介绍
- C++操作符重载
- Git 系列之二:Windows 下 Git 客户端的选择,及 msysGit 各种中文问题的解决
- [英文转数字]ZOJ 2971 Give Me the Number
- 隐藏鼠标
- ubuntu下Android环境搭建
- Git 系列之二:Windows 下 Git 客户端的选择,及 msysGit 各种中文问题的解决
- 百度网盘搜索
- PAT 1018
- C++操作符重载
- Android系统源代码你下载了吗?
- 不要认为它会自己去转换。
- mongodb