Java-POJ1014-Dividing
多重背包问题的特点是物品数量可以大于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的更多相关文章
- POJ1014 Dividing
题目来源:http://poj.org/problem?id=1014 题目大意: Marsha和Bill拥有一些弹珠.但是这些弹珠的价值不一样.每个弹珠的价值都是1到6之间的自然数.他们希望把这些弹 ...
- 【DP|多重背包可行性】POJ-1014 Dividing
Dividing Time Limit: 1000MS Memory Limit: 10000K Description Marsha and Bill own a collection of mar ...
- poj1014 Dividing (多重背包)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:id=1014">http://poj.org/problem?id=1014 Descrip ...
- POJ1014:Dividing(多重背包)
http://poj.org/problem?id=1014 Description Marsha and Bill own a collection of marbles. They want to ...
- [POJ1014]Dividing(二进制优化多重背包)
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int ...
- hdu1059&poj1014 Dividing (dp,多重背包的二分优化)
Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...
- poj分类解题报告索引
图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 【poj1014】 Dividing
http://poj.org/problem?id=1014 (题目链接) 题意 给出有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份, ...
- LeetCode算法题-Self Dividing Numbers(Java实现)
这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...
随机推荐
- 【WPF学习】第一章 XAML介绍
XAML(Extensible Application Markup Language的简写,发音为“zammel”)是用于实例化.NET对象的标记语言.尽管XAML是一种应用于诸多不同问题领域的技术 ...
- 解决NahimicSvc32.exe与bilibili直播姬的音频不兼容的问题
某次测试哔哩哔哩直播姬的时候发现系统声音采集异常的错误 NahimicSvc32.exe是NahimicService下的程序,奇怪的是我的本本所有硬件没有一个微星有关系,怎么就装上了微星的服务程序? ...
- Thymeleaf的基本用法
俗话说,不会前端的后端工程师不是一个合格的程序员.因为在项目中经常要和前端工程师打交道,并且偶尔也会涉及前端的简单开发,因此在闲暇之余学习了一点前端的知识,今天首先总结归纳一下 Thymeleaf 模 ...
- 【Linux远程连接工具】Xshell、Xftp家庭/学生版(免费使用)
注:Xshell.Xftp家庭/学生版无需激活,可以免费使用! 1.步骤一: 官网下载地址:https://www.netsarang.com/zh/ 选择[所有下载]->[家庭/学校免费] ...
- ElementUI的Table-column_render-header自定义表头
ElementUI的Table表格,官方网站上提供了很多样式,但是在日常开发中还会碰到各种情况,显然官方提供的是不能满足需求的.那么,我们就根据自己的需求对table进行改造. 先丢出关于Table的 ...
- 报错Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/...
首先我的jdk是11.05的 这个是由于: 这个是 由于缺少了javax.xml.bind,在jdk10.0.1中没有包含这个包,所以我自己去网上下载了jdk 8,然后把jdk10.0.1换成jdk ...
- 845. 八数码(bfs+map)
在一个3×3的网格中,1~8这8个数字和一个“X”恰好不重不漏地分布在这3×3的网格中. 例如: 1 2 3 X 4 6 7 5 8 在游戏过程中,可以把“X”与其上.下.左.右四个方向之一的数字交换 ...
- C++——动态内存分配2-创建对象数组
//创建对象数组 #include<iostream> using namespace std; class Point { public: Point() { ...
- 菜鸟教程 Missing parentheses in call to 'print'
个人博客 地址:http://www.wenhaofan.com/article/20180618180327 >>> print "hello" SyntaxE ...
- 2.2测试赛AC代码临时保存
//A #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...