题目地址:

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相关推荐

  1. 【翻译】Database Workload Capacity Planning using Time Series Analysis and Machine Learning

    [翻译]Database Workload Capacity Planning using Time Series Analysis and Machine Learning 基于时间序列分析和机器学 ...

  2. 【LintCode】算法题 1443. 最长AB子串

    描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...

  3. 【Lintcode】125. Backpack II

    题目地址: http://www.lintcode.com/problem/backpack-ii/description 0−10-10−1背包问题,AAA表示物品体积,VVV表示物品价值,背包容量 ...

  4. 【Lintcode】92. Backpack

    题目地址: https://www.lintcode.com/problem/backpack/description 背包问题.给定一个数组AAA代表每个物品的体积,和一个容积sss,问最多能塞满多 ...

  5. 【LintCode】Backpack 背包问题

    在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]. 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为11,可以选择[2, 3, 5]装入背包, ...

  6. 【Lintcode】562. Backpack IV

    题目地址: https://www.lintcode.com/problem/backpack-iv/description 给定一个数组AAA,代表每个物品的体积,题目保证AAA里的数全是正数并且没 ...

  7. 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连

    解析 max ksubarray sum:  最大和 of 连续子序列 =>   最大和 of  k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff:  无queu ...

  8. 【Lintcode】1413. Tree

    题目地址: https://www.lintcode.com/problem/tree/description 给定一个无向图,其有树性质,并且顶点编号为111的为树根(也就是这个图是个有根树).要求 ...

  9. 【Lintcode】1645. Least Subsequences

    题目地址: https://www.lintcode.com/problem/1645/ 给定一个长nnn的数组AAA,问AAA最少能分解为多少个严格递减的子序列之并. 在AAA上定义偏序关系< ...

最新文章

  1. 【linux】嵌入式中 crontab的使用
  2. jquery实现单行滚动效果
  3. 刚刚,2021年诺贝尔生理学或医学奖揭晓!
  4. 通过jquery获取td下的input标签的值,并且改变onclick的参数值
  5. CentOs7下lnmp环境安装
  6. 51nod 1562 玻璃切割 (STL map+一点点的思考)
  7. 黑马程序员_Java基础GUI
  8. vue-cli webpack 打包报错:Unexpected token: punc (()
  9. 吴恩达机器学习笔记(二) —— Logistic回归
  10. php GD库文字居中,PHP GD ttftext居中对齐
  11. android 系统(99)---MTK 平台系统重启分类
  12. 深度学习-吴恩达-笔记-4-深层神经网络
  13. 【java学习之路】数据库连接JDBC
  14. 华为大数据解决方案 (文末附PPT下载)
  15. python 10的次方_python e次方
  16. 计算机方面毕业生怎样写简历
  17. 网易企业邮箱 服务器 端口,网易企业邮箱客户端——Thunderbird设置
  18. 更快更强!华为大数据新版本让Hive提速50%!
  19. 310实验室一点补充
  20. 高考志愿填报APP靠谱吗?大数据仅供参考不能依赖

热门文章

  1. 爬取腾讯视频网站数据
  2. 软件项目管理 三点估算法
  3. 建仓类型与对应建仓价MT4
  4. 利用FPGA仿真软件modelsim仿真波形显示图片
  5. Android 源码 输入系统之 InputReader
  6. EOF需要在行首结束
  7. UVA - 1225
  8. 计算机网络基础知识满昌勇,-精选版《计算机网络》说课课件.ppt
  9. VS2010黑色主题Dark完美设置!
  10. 在R语言下配置企业微信机器人