多重背包问题的特点是物品数量可以大于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. VSCode添加git bash作为默认终端

    VSC添加git bash作为默认终端的settings.json添加 { "terminal.integrated.shell.windows": "D:\\Progr ...

  2. STM32学习笔记 —— 0.1 Keil5安装和DAP仿真下载器配置的相关问题与注意事项

    Keil5安装的注意事项 安装细节在此不再做过多赘述,主要介绍一下注意事项: 安装路径中不能有中文. ARM的Keil的路径不能与51的Keil的有冲突,必须将目录分开. Keil5中不会自动添加芯片 ...

  3. 剑指offer-基础练习-快速排序-排序

    /* 题目:快速排序 */ /* 思路:将一个数组分为两份,左边的数字小于index,右边的数字大于index,递归划分后形成一个排序后的数组. */ void QuickSort(int data[ ...

  4. gulp常用插件之gulp-replace使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-replace这是一款gulp3的字符串替换插件. 更多使用文档请点击访问gulp-replace工具官网. 安装 一键安装不多解释 n ...

  5. Jmeter实践

    Jmeter时间戳函数 详见:https://blog.csdn.net/dreamtl/article/details/68957447 ${__timeShift(yyyy-MM-dd HH:mm ...

  6. c#在类里不能使用Response解决方法

    response对应的类是HttpResponse,  在System.Web 命名字间里,   如果你在类中要使用   Response 的话,   需要使用System.Web.HttpConte ...

  7. sqlserver创建和删除外键约束

    x先找出约束名字然后删除它我给个例子 --测试环境--主表create table test1(id int primary key not null,value int)insert test1 s ...

  8. Python之旅第五天(习题集合)

    4天时间,虽然上着班,但是学的东西还是有点多,而且晚上看的比较容易忘,所以今天是习题模式,正好教程也是这么要求的,本来以为时间不长,没想到还是很崩溃啊.不多说,上干货. #关于随机产生验证码同时验证用 ...

  9. 1级搭建类110-Oracle 18c SI FS(Windows Server 2019)公开

    Oracle 18c 单实例文件系统在Windows Server 2019上的安装 在线查看

  10. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...