POJ 1014 Dividing(多重背包, 倍增优化)
Q: 倍增优化后, 还是有重复的元素, 怎么办
A: 假定重复的元素比较少, 不用考虑
Description
Input
The last line of the input file will be "0 0 0 0 0 0"; do not process this line.
Output
Output a blank line after each test case.
Sample Input
1 0 1 2 0 0
1 0 0 0 1 1
0 0 0 0 0 0
Sample Output
Collection #1:
Can't be divided. Collection #2:
Can be divided.
思路:
1. 倍增优化, 将 n 转化成 1, 2, 4 ..2^i , (n-前面的和), 然后应用 01背包问题处理
总结:
1. 判断恰好装满的条件为 dp[V] == V. 因为未初始化为 INF, 初始化为 INF 有个好处, 就是可以直接返回 dp[V], 但是更新 dp[v] 时需要加 dp[v] == inf 的判断
代码:
#include <iostream>
using namespace std;
int w[10];
int marble[10000];
int totalWeight;
int dp[120000];
int solve_dp() { int len = 0;
for(int i = 1; i <= 6; i ++) {
int sum = 0;
for(int j = 0;; j ++) {
if(sum + (1<<j) > w[i])
break;
marble[len++] = (1<<j)*i;
sum += (1<<j);
}
if(sum < w[i])
marble[len++] = (w[i]-sum)*i;
}
memset(dp, 0, totalWeight*sizeof(int));
// 01 背包
int V = totalWeight>>1;
dp[0] = 0;
for(int i = 0; i < len; i ++) {
for(int v = V; v >= marble[i]; v--) {
dp[v] = max(dp[v], dp[v-marble[i]]+marble[i]);
}
}
return (dp[V]==V);
}
int main() {
freopen("E:\\Copy\\ACM\\测试用例\\in.txt", "r", stdin);
int tc = 0;
do {
int sum = 0;
for(int i = 1; i <= 6; i ++) {
scanf("%d", &w[i]);
sum += w[i]*i;
}
if(sum == 0)
return 0;
tc ++;
if(sum & 1) { // 为奇数
printf("Collection #%d:\nCan't be divided.\n\n", tc);
continue;
}
// 重建 model, 转移成 01 背包问题
totalWeight = sum;
int ans = solve_dp();
if(!ans)
printf("Collection #%d:\nCan't be divided.\n\n", tc);
else
printf("Collection #%d:\nCan be divided.\n\n", tc);
}while(1);
return 0;
}
POJ 1014 Dividing(多重背包, 倍增优化)的更多相关文章
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
多重背包模板- #include <stdio.h> #include <string.h> int a[7]; int f[100005]; int v, k; void Z ...
- POJ 1014 Dividing 多重背包
Dividing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 63980 Accepted: 16591 Descri ...
- POJ 1014 Dividing (多重可行性背包)
题意 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两份的总价值相等,其中一个物品不能切开,只能分给其中的某一方,当输入六个0是( ...
- Dividing 多重背包 倍增DP
Dividing 给出n个物品的价值和数量,问是否能够平分.
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...
- hdu 1059 Dividing(多重背包优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- DFS(DP)---POJ 1014(Dividing)
原题目:http://poj.org/problem?id=1014 题目大意: 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两 ...
- hdu1059 dp(多重背包二进制优化)
hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
随机推荐
- cocos2d-x 3.0点击响应
迄今为止,发现cocos2d-x 3.0最让人惊艳的地方就是更改了点击事件机制.(ps:迄今只看了点击事件这块,捂嘴笑~~~) cocos2d-x 2.0 只有CCLayer有点击事件处理,需要注册, ...
- SparkStreaming操作Kafka
Kafka为一个分布式的消息队列,spark流操作kafka有两种方式: 一种是利用接收器(receiver)和kafaka的高层API实现. 一种是不利用接收器,直接用kafka底层的API来实现( ...
- 纯css3实现的圆形旋转分享按钮
之前已经为大家介绍了好几款css3按钮,今天要为大家介绍的是一款纯css3实现的圆形旋转分享按钮.旋转的角度可以自己调整.在demo中演示了三个角度旋转.360度,60度,-360度.如图: 在线预览 ...
- [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)
由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后 ...
- c#利用反射Assembly 对类和成员属性进行操作
protected static void test() { //获取程序集 Assembly assembly = System.Reflection.Assembly.GetExecutingAs ...
- oops_根据epc定位linux_kernel_panic位置
韩大卫@吉林师范大学 2014.12.10 转载请表明出处 ***************************************************** 关于内核报错 “Unable t ...
- Arrays.sort和Collections.sort实现原理解析
Arrays.sort和Collections.sort实现原理解析 1.使用 排序 2.原理 事实上Collections.sort方法底层就是调用的array.sort方法,而且不论是Collec ...
- Oracle的sql语句中关键字冲突用双引号
select distinc user from instrument where created>"TO_DATE"('2015-02-05 12:00:00', 'yyy ...
- easui Pagination Layout
分页显示方式有几种 layout: ['first', 'prev', 'next', 'last'] layout: ['list', 'sep', 'first', 'prev', 'sep', ...
- Javascript中最常用的61个经典技巧[转]
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...