POJ 1014 Dividing(多重背包, 倍增优化)

时间:2022-08-30 13:57:11

Q: 倍增优化后, 还是有重复的元素, 怎么办

A: 假定重复的元素比较少, 不用考虑

Description

Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the marbles had the same value, because then they could just split the collection in half. But unfortunately, some of the marbles are larger, or more beautiful than others. So, Marsha and Bill start by assigning a value, a natural number between one and six, to each marble. Now they want to divide the marbles so that each of them gets the same total value. Unfortunately, they realize that it might be impossible to divide the marbles in this way (even if the total value of all marbles is even). For example, if there are one marble of value 1, one of value 3 and two of value 4, then they cannot be split into sets of equal value. So, they ask you to write a program that checks whether there is a fair partition of the marbles.

Input

Each line in the input file describes one collection of marbles to be divided. The lines contain six non-negative integers n1 , . . . , n6 , where ni is the number of marbles of value i. So, the example from above would be described by the input-line "1 0 1 2 0 0". The maximum total number of marbles will be 20000. 
The last line of the input file will be "0 0 0 0 0 0"; do not process this line.

Output

For each collection, output "Collection #k:", where k is the number of the test case, and then either "Can be divided." or "Can't be divided.". 
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(多重背包, 倍增优化)的更多相关文章

  1. Hdu 1059 Dividing &amp&semi; Zoj 1149 &amp&semi; poj 1014 Dividing&lpar;多重背包&rpar;

    多重背包模板- #include <stdio.h> #include <string.h> int a[7]; int f[100005]; int v, k; void Z ...

  2. POJ 1014 Dividing 多重背包

    Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63980   Accepted: 16591 Descri ...

  3. POJ 1014 Dividing &lpar;多重可行性背包&rpar;

    题意 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两份的总价值相等,其中一个物品不能切开,只能分给其中的某一方,当输入六个0是( ...

  4. Dividing 多重背包 倍增DP

    Dividing 给出n个物品的价值和数量,问是否能够平分.

  5. HDOJ&lpar;HDU&rpar;&period;1059 Dividing&lpar;DP 多重背包&plus;二进制优化&rpar;

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

  6. hdu 1059 Dividing&lpar;多重背包优化&rpar;

    Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  7. DFS&lpar;DP&rpar;---POJ 1014&lpar;Dividing&rpar;

    原题目:http://poj.org/problem?id=1014 题目大意: 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两 ...

  8. hdu1059 dp&lpar;多重背包二进制优化&rpar;

    hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...

  9. HDOJ&lpar;HDU&rpar;&period;2844 Coins &lpar;DP 多重背包&plus;二进制优化&rpar;

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

随机推荐

  1. 【无私分享:ASP&period;NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前 ...

  2. 让PDF&period;NET支持最新的SQLite数据库

    最近项目中用到了SQLite,之前项目中用的是PDF.NET+MySQL的组合,已经写了不少代码,如果能把写好的代码直接用在SQLite上就好了,PDF.NET支持大部分主流的数据库,这个当然可以,只 ...

  3. delphi&period;指针&period;PChar

    此文是delphi.指针.应用姊妹篇,想细化一下PChar应用,所以有了此文. 注意: 1:此文讲的是PChar与字符串相关操作,其它方法暂不多讲. 2:由于D分开Ansi/Unicode的两种完全不 ...

  4. JAVA 编码中文简述

    中文编码问题虽然是个老问题,但对不熟悉的人来说还是不好处理的.不过Java中已经有了一套比较成熟的解决方案. 首先对中文编码格式予以简单介绍:中文编码有三套国标:GB2312,GBK,GB18030, ...

  5. Cookie与Session的初探

    1.Cookie 2.Session 每当一个新的请求来时,asp.net会根据浏览器有没传来SessionId(一般用Cookie传过来的,也可以用url传),来判断是新创建一个session还是根 ...

  6. git svn 简易同时使用

    这个方法适合于新的一个git 仓库.假如你使用的git 是最新版本,git本身提供了 git svn命令. 1. 进入一个空的目录,初始化一个空的git仓库: git svn init svn://x ...

  7. windows做时间服务器,linux和windows时间同步

    找了很多的资料,都没有windows做时间服务,linux同步windows的时间的,最后自己找了一些软件,终于搞定了,写出来给大家共享,以免大家多走弯路 首先在http://www.meinberg ...

  8. SpringMVC-1-(简介及HelloWord)

    首先我们来看一下servlet的处理请求的方式: 一:SpringMVC简介: 一)SpringMVC中的几个重要组件 1.DispatchServlet: 前端控制器,mvc模式中的c,是整个流程的 ...

  9. Maven 安装 on centos7

    本文演示如何在CentOS7上安装maven. 1 准备工作 1.1 进入官网下载栏目 http://maven.apache.org/download.cgi 找到下载列表中 Binary tar. ...

  10. luogu P3243 &lbrack;HNOI2015&rsqb;菜肴制作

    这题一看就知道和拓扑序有关 考虑拓扑排序的时候每次取队列里最小的数进行排序 然后就\(\mathcal{GG}\)了,因为这样只能使字典序最小,而并不能保证题目中要求的每个编号的数要在满足前面数尽量在 ...