package dp;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 背包九讲** @ProjectName: algorithm* @Package: dp* @Description: TODO* @Author: bipa* @Date: 2022/1/8 8:00*/
public class Pack {/*** 01背包(每样物品的数量为一个)** @param n 物品样数* @param m 背包容量* @param v 物品体积* @param w 物品价值* @return 总体积不超过m的最大价值*/public static int pack01(int n, int m, int[] v, int[] w) {int[] dp = new int[m + 1];for (int i = 0; i < n; i++) {for (int j = m; j >= v[i]; j--) {dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]);}}return dp[m];}/*** 01背包方案数** @param n   物品数量* @param m   背包容量* @param v   物品体积* @param w   物品价值* @param mod 10^9 + 7* @return 最优选法的方案数*/public static int getNumber(int n, int m, int[] v, int[] w, int mod) {int[] dp = new int[m + 1], num = new int[m + 1];Arrays.fill(dp, Integer.MIN_VALUE);num[0] = 1;dp[0] = 0;for (int i = 0; i < n; i++) {for (int j = m; j >= v[i]; j--) {int temp = Math.max(dp[j], dp[j - v[i]] + w[i]);int sum = 0;if (temp == dp[j]) {sum += num[j];}if (temp == dp[j - v[i]] + w[i]) {sum += num[j - v[i]];}if (sum >= mod) {sum -= mod;}dp[j] = temp;num[j] = sum;}}int max = 0;for (int i = 0; i <= m; i++) {max = Math.max(max, dp[i]);}int res = 0;for (int i = 0; i <= m; i++) {if (max == dp[i]) {res += num[i];if (res >= mod) {res -= mod;}}}return res;}/*** 01背包具体方案** @param n    物品数量* @param m    背包容量* @param v    物品体积* @param w    物品价值* @param link 连接符* @return 最优选法的具体方案*/public static String getPath(int n, int m, int[] v, int[] w, String link) {int[][] dp = new int[n + 1][m + 1];for (int i = n - 1; i >= 0; i--) {for (int j = 0; j <= m; j++) {dp[i][j] = dp[i + 1][j];if (j >= v[i]) {dp[i][j] = Math.max(dp[i][j], dp[i+1][j - v[i]] + w[i]);}}}StringBuilder sb = new StringBuilder();for (int i = 0; i < n; i++) {if (dp[i][m] == dp[i+1][m- v[i]] + w[i]) {sb.append(link).append(i);m -= v[i];}}return sb.substring(1);}/*** 完全背包(每样物品的数量无限制)** @param n 物品样数* @param m 背包容量* @param v 物品体积* @param w 物品价值* @return 总体积不超过m的最大价值*/public static int packComplete(int n, int m, int[] v, int[] w) {int[] dp = new int[m + 1];for (int i = 0; i < n; i++) {for (int j = v[i]; j <= m; j++) {dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]);}}return dp[m];}/*** 多重背包(每样物品的数量为s)** @param n 物品样数* @param m 背包容量* @param v 物品体积* @param w 物品价值* @param s 每样物品的数量* @return 总体积不超过m的最大价值*/public static int packMultiple(int n, int m, int[] v, int[] w, int[] s) {int[] dp_I = new int[m + 1];for (int i = 0; i < n; i++) {for (int j = m; j >= v[i]; j--) {for (int k = 1; k <= s[i] && k * v[i] <= j; k++) {dp_I[j] = Math.max(dp_I[j], dp_I[j - k * v[i]] + k * w[i]);}}}/*** 二进制优化,将每样物品的数量进行二进制拆分*/int[] dp_II = new int[m + 1];class Goods {int v; // 体积int w; // 价值Goods(int v, int w) {this.v = v;this.w = w;}}List<Goods> goods = new ArrayList<>();for (int i = 0; i < n; i++) {int k = s[i];for (int j = 1; j <= k; j *= 2) {k -= j;goods.add(new Goods(j * v[i], j * w[i]));}if (k > 0) {goods.add(new Goods(k * v[i], k * w[i]));}}for (Goods g : goods) {for (int i = m; i >= g.v; i--) {dp_II[i] = Math.max(dp_II[i], dp_II[i - g.v] + g.w);}}return dp_I[m];}/*** 二维费用背包** @param n 物品样数* @param V 背包体积* @param M 背包承受重量* @param v 物品体积* @param m 物品质量* @param w 物品价值* @return 总体积不超过V,总质量不超过M的最大价值*/public static int packTwo(int n, int V, int M, int[] v, int[] m, int[] w) {int[][] dp = new int[V + 1][M + 1];for (int i = 0; i < n; i++) {for (int j = V; j >= v[i]; j--) {for (int k = M; k >= m[i]; k--) {dp[j][k] = Math.max(dp[j][k], dp[j - v[i]][k - m[i]] + w[i]);}}}return dp[V][M];}/*** 分组背包(每组物品最多选一个)** @param n 组的数量* @param m 背包容量* @param v 物品体积* @param w 物品价值* @return 总体积不超过m的最大价值*/public static int packGroup(int n, int m, List<Integer>[] v, List<Integer>[] w) {int[] dp = new int[m + 1];for (int i = 0; i < n; i++) {for (int j = m; j >= 0; j--) {for (int k = 0; k < v[i].size(); k++) {if (j >= v[i].get(k)) {dp[j] = Math.max(dp[j], dp[j - v[i].get(k)] + w[i].get(k));}}}}return dp[m];}}

背包九讲Java版本相关推荐

  1. 第二讲 完全背包问题(对背包九讲的学习)

    学习自:背包九讲 题目 有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. ...

  2. 算法--背包九讲(详细讲解+代码)

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  3. dalao的背包九讲

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  4. 【转】《背包九讲》--崔添翼大神

    背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物 ...

  5. 转载——背包九讲(原文链接已不可考)

    浙大崔添翼对背包问题的讲解,观点很高也很深刻,特此转载. 背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问 ...

  6. dd大牛的背包九讲-背包问题汇总

    背包九讲 目录  第一讲 01背包问题  第二讲 完全背包问题  第三讲 多重背包问题  第四讲 混合三种背包问题  第五讲 二维费用的背包问题  第六讲 分组的背包问题  第七讲 有依赖的背包问题  ...

  7. 【算法】动态规划+“背包九讲”原理超详细讲解+常见dp问题(9种)总结

    目录 一.动态规划(DP) 二.背包九讲 (1)完全背包 P1616 疯狂的采药(完全背包) (2)01背包 滚动数组 一维数组 P1048 采药(01背包) 01背包表格图示 (3)多重背包 整数拆 ...

  8. dp背包九讲(待补充,暂时前两讲)

    文章目录 背包九讲 一.01背包 二维dp 优化为一维 二.完全背包 二维dp 优化为一维 三.多重背包 数据范围很小时,变成01背包暴力 当数据范围较大时,利用二进制优化 二进制优化还不够用时,利用 ...

  9. 完全背包问题python_令人头疼的背包九讲(2)完全背包问题

    重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题. 题目 完全背包问题 题目要求 有n ...

  10. 背包九讲之一:01背包问题

    文章目录 说明: 01背包问题 题目 基本思路 初始化的细节问题 优化空间复杂度 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添 ...

最新文章

  1. 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
  2. Python零基础入门(4)——强大的分支与循环
  3. ActiveMQ入门教程(三) - ActiveMQ P2P版的HelloWorld
  4. 利用最小二乘法,用直线拟合点时,为什么计算竖直距离而非垂直距离?为什么在线性回归分析中,求的是距离平方和最小,而不是距离之和最小?
  5. 写给 Web 开发者的深度学习教程 - 向量化 矩阵
  6. .net odbc连接mysql数据库,下载安装MySQL数据库ODBC驱动和配置MySQL ODBC数据源
  7. redis和kafka读取代码
  8. PHP云尚发卡,云尚发卡1.5.7添加(极客支付)
  9. python web编程 创建一个web服务器
  10. Jersey 2.x 运行项目
  11. ActivityGroup切换不用每次加载视图
  12. java informix_Informix 数据库的数据类型
  13. Acquiring lock on /XXX/XXXXX/, If you continue to see this message, you can try toggling the remote.
  14. fatal: unable to access ‘http://g.oho168.com:88/yanjiaxue/anymz.git/‘: Could not resolve host: g.oho
  15. 在可靠的头肩底中淘金(转 封起De日子)
  16. kubernetes(K8S)容器部署,重新启动后,node节点提示notready无法正常工作。
  17. 将进酒:《惜樽空》敦煌抄本
  18. zoc for mac注册码
  19. redis简略版笔记
  20. vivado报错 syntax error、dout is an unknown type

热门文章

  1. 图片识别不了小程序怎么办_【信息素养】教你怎么用微信小程序进行文字识别...
  2. 【2022美赛F奖】B题:水电共享
  3. MATLAB建模与仿真(第一章基础--第四章画图)
  4. C# 通过窗口句柄为指定窗口发送指令(user32.dll,mshtml)
  5. Visio 2019 专业版安装教程
  6. My BlackBerry
  7. IATF16949认证辅导,FMEA和CP的顾客额外批准,对供应链安全的管理(适用时)
  8. 宽度学习(BLS)网络的研究和应用
  9. “飞客蠕虫”形成全球最大僵尸网络 每日感染数万网民
  10. 暴风一号 病毒 源码学习