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背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
随机推荐
-
【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前 ...
-
让PDF.NET支持最新的SQLite数据库
最近项目中用到了SQLite,之前项目中用的是PDF.NET+MySQL的组合,已经写了不少代码,如果能把写好的代码直接用在SQLite上就好了,PDF.NET支持大部分主流的数据库,这个当然可以,只 ...
-
delphi.指针.PChar
此文是delphi.指针.应用姊妹篇,想细化一下PChar应用,所以有了此文. 注意: 1:此文讲的是PChar与字符串相关操作,其它方法暂不多讲. 2:由于D分开Ansi/Unicode的两种完全不 ...
-
JAVA 编码中文简述
中文编码问题虽然是个老问题,但对不熟悉的人来说还是不好处理的.不过Java中已经有了一套比较成熟的解决方案. 首先对中文编码格式予以简单介绍:中文编码有三套国标:GB2312,GBK,GB18030, ...
-
Cookie与Session的初探
1.Cookie 2.Session 每当一个新的请求来时,asp.net会根据浏览器有没传来SessionId(一般用Cookie传过来的,也可以用url传),来判断是新创建一个session还是根 ...
-
git svn 简易同时使用
这个方法适合于新的一个git 仓库.假如你使用的git 是最新版本,git本身提供了 git svn命令. 1. 进入一个空的目录,初始化一个空的git仓库: git svn init svn://x ...
-
windows做时间服务器,linux和windows时间同步
找了很多的资料,都没有windows做时间服务,linux同步windows的时间的,最后自己找了一些软件,终于搞定了,写出来给大家共享,以免大家多走弯路 首先在http://www.meinberg ...
-
SpringMVC-1-(简介及HelloWord)
首先我们来看一下servlet的处理请求的方式: 一:SpringMVC简介: 一)SpringMVC中的几个重要组件 1.DispatchServlet: 前端控制器,mvc模式中的c,是整个流程的 ...
-
Maven 安装 on centos7
本文演示如何在CentOS7上安装maven. 1 准备工作 1.1 进入官网下载栏目 http://maven.apache.org/download.cgi 找到下载列表中 Binary tar. ...
-
luogu P3243 [HNOI2015]菜肴制作
这题一看就知道和拓扑序有关 考虑拓扑排序的时候每次取队列里最小的数进行排序 然后就\(\mathcal{GG}\)了,因为这样只能使字典序最小,而并不能保证题目中要求的每个编号的数要在满足前面数尽量在 ...