多重背包问题的特点是物品数量可以大于1但是有限制。状态定义与01背包一致。

多重背包的解法有多种,复杂度也各不相同。

对于物品数Ci较大的数据,可以采取二进制数进行优化(就是这样,别问就是baidu!)

如何理解多重背包的二进制优化?

使得每种物品的转移次数由O(MxCi)变为O(Mxlog(Ci))

f[i]=f[i] | f[i-a[i]] | …| f[i-a[i]xc[i]](a[i]为物品价值,c[i]为物品数量)

二进制优化后令W[i]=a[i]xc[i](c[i]被二进制分拆)

/*
Memory: 3508K Time: 329MS
Language: Java Result: Accepted
*/

实现见代码:

 package poj.ProblemSet;

 import java.util.Scanner;

 public class poj1014 {
public static final int MAXN = 400000;
public static boolean[] f = new boolean[MAXN];
public static int[] w = new int[100]; public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
for (int Case = 0; cin.hasNext(); ) {
int value = 0, cnt = 0;
boolean flag = false;
for (int i = 1; i <= 6; i++) {
int val = cin.nextInt();
value += val * i;
for (int j = 1, x = 0; val > 0; j *= 2) {
x = Math.min(j, val);
w[++cnt] = i * x;
val -= x;
}
}
if (value == 0) break;
System.out.println("Collection #" + (++Case) + ":");
if (value % 2 == 0) {
f[0] = true;
for (int i = 1; i < MAXN; i++) f[i] = false;
for (int i = 1; i <= cnt; i++)
for (int j = value / 2; j >= w[i]; j--)
f[j] |= f[j - w[i]];
flag = true;
}
System.out.println((!flag?"Can't":(f[value/2]?"Can":"Can't"))+" be divided.");
System.out.println();
}
}
}

 PS:另外一种O(VN)的方法是用数据结构单调队列优化!!!Orz

/*
Memory: 6064K Time: 282MS
Language: Java Result: Accepted
*/
 package poj.ProblemSet;

 import java.util.Scanner;

 public class poj1014 {
public static final int MAXN = 400000;
public static int[] queue = new int[MAXN];
public static boolean[] f = new boolean[MAXN];
public static int[] c = new int[7];
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
for (int Case = 0; cin.hasNext(); ) {
int value = 0;
boolean flag = false;
for (int i = 1; i <= 6; i++) {
c[i] = cin.nextInt();
value += i * c[i];
}
if (value == 0) break;
System.out.println("Collection #" + (++Case) + ":");
if (value % 2 == 0) {
f[0] = true;
for (int i = 1; i <= value / 2; i++) f[i] = false;
for (int i = 1, x = 0; i <= 6; i++) {
x = i * c[i];
for (int j = 0; j < i; j++)
if (f[j]) queue[j] = j;
else queue[j] = -MAXN;
for (int j = i; j <= value / 2; j++)
if (f[j]) queue[j] = j;
else {
queue[j] = queue[j - i];
if (queue[j - i] + x >= j) f[j] = true;
}
}
flag = true;
}
System.out.println((!flag?"Can't":(f[value/2]?"Can":"Can't"))+" be divided.");
System.out.println();
}
}
}

Java-POJ1014-Dividing的更多相关文章

  1. POJ1014 Dividing

    题目来源:http://poj.org/problem?id=1014 题目大意: Marsha和Bill拥有一些弹珠.但是这些弹珠的价值不一样.每个弹珠的价值都是1到6之间的自然数.他们希望把这些弹 ...

  2. 【DP|多重背包可行性】POJ-1014 Dividing

    Dividing Time Limit: 1000MS Memory Limit: 10000K Description Marsha and Bill own a collection of mar ...

  3. poj1014 Dividing (多重背包)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:id=1014">http://poj.org/problem?id=1014 Descrip ...

  4. POJ1014:Dividing(多重背包)

    http://poj.org/problem?id=1014 Description Marsha and Bill own a collection of marbles. They want to ...

  5. [POJ1014]Dividing(二进制优化多重背包)

    #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int ...

  6. hdu1059&poj1014 Dividing (dp,多重背包的二分优化)

    Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...

  7. poj分类解题报告索引

    图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...

  8. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  9. 【poj1014】 Dividing

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

  10. LeetCode算法题-Self Dividing Numbers(Java实现)

    这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...

随机推荐

  1. Python 测试代码 初学者笔记

    单元测试 每完成一个单元测试,Python都会打印一个字符: 测试通过打印一个句点:测试引发错误打印E:测试导致断言失败打印F 模块unittest import unittest from name ...

  2. Spark学习之路 (八)SparkCore的调优之开发调优[转]

    前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...

  3. 问题 C: To Fill or Not to Fill

    #include <cstdio> #include <vector> #include <algorithm> #include <cmath> us ...

  4. Django models 关联(一对多,多对多,一对一)

    参考:https://blog.csdn.net/houyanhua1/article/details/84953388

  5. vue自学入门-8(vue slot-scope)

    vue自学入门-1(Windows下搭建vue环境) vue自学入门-2(vue创建项目) vue自学入门-3(vue第一个例子) vue自学入门-4(vue slot) vue自学入门-5(vuex ...

  6. TCL常用命令

    1.删除文件 file delete A file delete -force A 2.建立文件夹 file mkdir A file mkdir A/A 3.判断文件夹是否存在 file exist ...

  7. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.2)-- Asynchronous Event Request command

    5.2 异步事件请求命令 异步事件用于当状态.错误.健康信息这些事件发生时通知主机软件.为了使能这个controller报告的异步事件,主机软件需要提交一个或多个异步事件请求命令到controller ...

  8. ALSA lib-io plugin

    https://www.alsa-project.org/alsa-doc/alsa-lib/pcm_external_plugins.html External Plugin: I/O Plugin ...

  9. 小I选宾馆

    小 I 选宾馆 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣的 ...

  10. many connection errors,更改max_connection_errors的值

    https://www.cnblogs.com/tonyccc/p/11496101.html https://blog.csdn.net/li_li_lin/article/details/7276 ...