背包问题模板,POJ(1014)
2016-05-26 20:31
309 查看
题目链接:http://poj.org/problem?id=1014
背包问题太经典了,之前的一篇博客已经讲了背包问题的原理。
这一个题目是多重背包,但是之前的枚举是超时的,这里采用二进制优化。
这是所有01背包,完全背包,多重背包的模板哦!
背包问题太经典了,之前的一篇博客已经讲了背包问题的原理。
这一个题目是多重背包,但是之前的枚举是超时的,这里采用二进制优化。
这是所有01背包,完全背包,多重背包的模板哦!
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int sum; int num[7], dp[60000 + 60]; void ZeroOnePack(int cost, int weight, int V) { for (int i = V; i >= cost; i--) { dp[i] = max(dp[i], dp[i - cost] + weight); } } void CompletePack(int cost, int weight, int V) { for (int i = cost; i <= V; i++) { dp[i] = max(dp[i], dp[i - cost] + weight); } } void MultiPack(int cost, int weight, int V, int amount) { if (cost * amount >= V) { CompletePack(cost, weight, V); return; } int k = 1; while (k < amount) { ZeroOnePack(cost * k, weight * k, V); amount -= k; k *=2; } ZeroOnePack(cost * amount, weight * amount, V); } int main() { int t = 1; while (~scanf("%d", &num[1])) { sum = num[1]; for (int i = 2; i <= 6; i++) { scanf("%d", &num[i]); sum += num[i] * i; } if (num[1] + num[2] + num[3] + num[4] + num[5] + num[6] == 0) break; printf("Collection #%d:\n", t++); if (sum % 2) { puts("Can't be divided.\n"); continue; } sum >>= 1; memset(dp, 0, sizeof(dp)); for (int i = 1; i <= 6; i++) { MultiPack(i, i, sum, num[i]); } if (dp[sum] != sum) { puts("Can't be divided.\n"); } else puts("Can be divided.\n"); } return 0; }
相关文章推荐
- 磁盘测速工具汇总
- Larmes琅幕仕家居马头长款短柄自动雨伞 晴雨两用太阳伞防紫外线遮阳男士商务伞 雨伞雨具 骏马长款-金色配饰【图片 价格 品牌 报价】-京东
- 123sdfdsfdsfsdf
- for循环的写法
- EAS KDTable 判断点击的是表头
- 文件读取写入
- mybatis系列-12-多对多查询
- 摩托车继承自行车和机动车
- C Tricks(四)—— 从数组中随机选择一个元素
- IO多路复用之select
- 2016SDAU课程练习三1002
- eclipse代码自动提示,eclipse设置代码自动提示
- 通过HttpServletRequest判断客户端浏览器类型是否为IE11
- CocoaPods 错误 target overrides the `OTHER_LDFLAGS`
- Android自助餐之EventBus框架
- eclipse代码自动提示,eclipse设置代码自动提示
- 2016年5月26日晚上(妙味课堂js基础-2笔记三(DOM))
- solr suggest智能提示配置
- zookeeper的四种类型的节点
- Entity Framework4.0 (七) EF4的存储过程