【Lintcode】1382 · High Capacity Backpack
题目地址:
https://www.lintcode.com/problem/1382/description
给定一个背包,容量sss,再给定nnn个物品,各自体积是c[i]c[i]c[i],各自价值是v[i]v[i]v[i]。问在不超过背包容量的情况下,取物品的最大价值是多少。每个物品限取一次。数据中,容量sss和物品的体积和价值取值范围是1≤s,v[i],c[i]≤10131\le s,v[i],c[i]\le 10^{13}1≤s,v[i],c[i]≤1013,而1≤n≤311\le n\le 311≤n≤31。
直接用动态规划的话时间复杂度是O(ns)O(ns)O(ns),会超时。这题需要用双向DFS来做,参考https://blog.csdn.net/qq_46105170/article/details/115587834。代码如下:
import java.util.ArrayList;
import java.util.List;public class Solution {long res;/*** @param s: The capacity of backpack* @param v: The value of goods* @param c: The capacity of goods* @return: The answer*/public long getMaxValue(int s, int[] v, int[] c) {// Write your code hereint n = v.length, k = n >> 1;List<long[]> comb1 = new ArrayList<>();// 求前半部分物品的所有组合的体积和价值dfs1(0, k, 0, 0, v, c, comb1, s);// 去重并优化comb1.sort((x, y) -> x[0] == y[0] ? Long.compare(x[1], y[1]) : Long.compare(x[0], y[0]));int j = 0;for (int i = 0; i < comb1.size(); i++) {int ii = i;while (ii < comb1.size() && comb1.get(ii)[0] == comb1.get(i)[0]) {ii++;}long[] item = comb1.get(ii - 1);if (j == 0 || item[1] > comb1.get(j - 1)[1]) {comb1.set(j++, item);}i = ii - 1;}// 去完重后,只需考虑不重复的前j个组合comb1 = comb1.subList(0, j);// 枚举后半部分的所有物品的组合,并且用二分求得体积少于s的最大总价值dfs2(k, n, 0, 0, v, c, comb1, s);return res;}void dfs1(int u, int k, long sv, long sc, int[] v, int[] c, List<long[]> comb1, int s) {if (u == k) {comb1.add(new long[]{sc, sv});return;}dfs1(u + 1, k, sv, sc, v, c, comb1, s);if (sc + c[u] <= s) {dfs1(u + 1, k, sv + v[u], sc + c[u], v, c, comb1, s);}}void dfs2(int u, int n, long sv, long sc, int[] v, int[] c, List<long[]> comb1, int s) {if (u == n) {int l = 0, r = comb1.size() - 1;while (l < r) {int mid = l + (r - l + 1 >> 1);if (comb1.get(mid)[0] + sc <= s) {l = mid;} else {r = mid - 1;}}res = Math.max(res, comb1.get(l)[1] + sv);return;}dfs2(u + 1, n, sv, sc, v, c, comb1, s);if (sc + c[u] <= s) {dfs2(u + 1, n, sv + v[u], sc + c[u], v, c, comb1, s);}}
}
时间复杂度O(n2n/2)O(n2^{n/2})O(n2n/2),空间O(2n/2)O(2^{n/2})O(2n/2)。
【Lintcode】1382 · High Capacity Backpack相关推荐
- 【翻译】Database Workload Capacity Planning using Time Series Analysis and Machine Learning
[翻译]Database Workload Capacity Planning using Time Series Analysis and Machine Learning 基于时间序列分析和机器学 ...
- 【LintCode】算法题 1443. 最长AB子串
描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...
- 【Lintcode】125. Backpack II
题目地址: http://www.lintcode.com/problem/backpack-ii/description 0−10-10−1背包问题,AAA表示物品体积,VVV表示物品价值,背包容量 ...
- 【Lintcode】92. Backpack
题目地址: https://www.lintcode.com/problem/backpack/description 背包问题.给定一个数组AAA代表每个物品的体积,和一个容积sss,问最多能塞满多 ...
- 【LintCode】Backpack 背包问题
在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]. 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为11,可以选择[2, 3, 5]装入背包, ...
- 【Lintcode】562. Backpack IV
题目地址: https://www.lintcode.com/problem/backpack-iv/description 给定一个数组AAA,代表每个物品的体积,题目保证AAA里的数全是正数并且没 ...
- 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连
解析 max ksubarray sum: 最大和 of 连续子序列 => 最大和 of k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff: 无queu ...
- 【Lintcode】1413. Tree
题目地址: https://www.lintcode.com/problem/tree/description 给定一个无向图,其有树性质,并且顶点编号为111的为树根(也就是这个图是个有根树).要求 ...
- 【Lintcode】1645. Least Subsequences
题目地址: https://www.lintcode.com/problem/1645/ 给定一个长nnn的数组AAA,问AAA最少能分解为多少个严格递减的子序列之并. 在AAA上定义偏序关系< ...
最新文章
- 【linux】嵌入式中 crontab的使用
- jquery实现单行滚动效果
- 刚刚,2021年诺贝尔生理学或医学奖揭晓!
- 通过jquery获取td下的input标签的值,并且改变onclick的参数值
- CentOs7下lnmp环境安装
- 51nod 1562 玻璃切割 (STL map+一点点的思考)
- 黑马程序员_Java基础GUI
- vue-cli webpack 打包报错:Unexpected token: punc (()
- 吴恩达机器学习笔记(二) —— Logistic回归
- php GD库文字居中,PHP GD ttftext居中对齐
- android 系统(99)---MTK 平台系统重启分类
- 深度学习-吴恩达-笔记-4-深层神经网络
- 【java学习之路】数据库连接JDBC
- 华为大数据解决方案 (文末附PPT下载)
- python 10的次方_python e次方
- 计算机方面毕业生怎样写简历
- 网易企业邮箱 服务器 端口,网易企业邮箱客户端——Thunderbird设置
- 更快更强!华为大数据新版本让Hive提速50%!
- 310实验室一点补充
- 高考志愿填报APP靠谱吗?大数据仅供参考不能依赖