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 ...
随机推荐
- Xamarin.Forms登录对话框及表单验证
微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏. Xamarin.Forms登录系统 内容目录 实现效果 业务场景 编码实现 ...
- CSS:overflow 内容溢出属性
overflow 属性规定当内容溢出元素框时发生的事情 值 描述 visible 默认值.内容不会被修剪,会呈现在元素框之外. hidden 内容会被修剪,并且其余内容是不可见的. scroll 内容 ...
- P6070 [RC-02] GCD [杜教筛,莫比乌斯反演]
没啥好说的,杜教筛板子题. \[\sum_{i=1}^{N} \sum_{j=1}^{N}\sum_{p=1}^{\lfloor \frac{N}{j} \rfloor}\sum_{q=1}^{\lf ...
- gulp常用插件之gulp-rev-collector使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-rev-collector这是一款根据gulp-rev生成的manifest.json文件中的映射, 去替换文件名称, 也可以替换路径. ...
- 在RYU中实现交换机的功能
首先源码,解析部分如下,同时可以参考RYU_BOOK上的解释说明 原文链接参考:https://blog.csdn.net/qq_34099967/article/details/89047741 ...
- LeetCode 965. 单值二叉树 (遍历二叉树)
题目链接:https://leetcode-cn.com/problems/univalued-binary-tree/ 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树. 只有给定的树是 ...
- PAT (Basic Level) Practice (中文)1038 统计同成绩学生 (20 分)
本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即学生总人数.随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔.最 ...
- Codeforces 1303E. Erase Subsequences 代码(dp 字符串压缩一维状态优化)
https://codeforces.com/contest/1303/problem/E #include<bits/stdc++.h> using namespace std; ; i ...
- 使用ADO.NET 访问数据库
一.ADO.NET :用于连接数据库的技术 1.ADO.NET分为两大组件 DataSet:数据集 .NET FRAMWORK :用于连接到数据库,发送命令,检索结果 2.ADO.NET四大核心对象 ...
- pip 更换镜像源
国内的pip源 阿里云:https://mirrors.aliyun.com/pypi/simple/ 清华:https://pypi.tuna.tsinghua.edu.cn/simple 中国科技 ...