背包九讲Java版本
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版本相关推荐
- 第二讲 完全背包问题(对背包九讲的学习)
学习自:背包九讲 题目 有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. ...
- 算法--背包九讲(详细讲解+代码)
背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...
- dalao的背包九讲
背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...
- 【转】《背包九讲》--崔添翼大神
背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物 ...
- 转载——背包九讲(原文链接已不可考)
浙大崔添翼对背包问题的讲解,观点很高也很深刻,特此转载. 背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问 ...
- dd大牛的背包九讲-背包问题汇总
背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...
- 【算法】动态规划+“背包九讲”原理超详细讲解+常见dp问题(9种)总结
目录 一.动态规划(DP) 二.背包九讲 (1)完全背包 P1616 疯狂的采药(完全背包) (2)01背包 滚动数组 一维数组 P1048 采药(01背包) 01背包表格图示 (3)多重背包 整数拆 ...
- dp背包九讲(待补充,暂时前两讲)
文章目录 背包九讲 一.01背包 二维dp 优化为一维 二.完全背包 二维dp 优化为一维 三.多重背包 数据范围很小时,变成01背包暴力 当数据范围较大时,利用二进制优化 二进制优化还不够用时,利用 ...
- 完全背包问题python_令人头疼的背包九讲(2)完全背包问题
重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题. 题目 完全背包问题 题目要求 有n ...
- 背包九讲之一:01背包问题
文章目录 说明: 01背包问题 题目 基本思路 初始化的细节问题 优化空间复杂度 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添 ...
最新文章
- 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
- Python零基础入门(4)——强大的分支与循环
- ActiveMQ入门教程(三) - ActiveMQ P2P版的HelloWorld
- 利用最小二乘法,用直线拟合点时,为什么计算竖直距离而非垂直距离?为什么在线性回归分析中,求的是距离平方和最小,而不是距离之和最小?
- 写给 Web 开发者的深度学习教程 - 向量化 矩阵
- .net odbc连接mysql数据库,下载安装MySQL数据库ODBC驱动和配置MySQL ODBC数据源
- redis和kafka读取代码
- PHP云尚发卡,云尚发卡1.5.7添加(极客支付)
- python web编程 创建一个web服务器
- Jersey 2.x 运行项目
- ActivityGroup切换不用每次加载视图
- java informix_Informix 数据库的数据类型
- Acquiring lock on /XXX/XXXXX/, If you continue to see this message, you can try toggling the remote.
- fatal: unable to access ‘http://g.oho168.com:88/yanjiaxue/anymz.git/‘: Could not resolve host: g.oho
- 在可靠的头肩底中淘金(转 封起De日子)
- kubernetes(K8S)容器部署,重新启动后,node节点提示notready无法正常工作。
- 将进酒:《惜樽空》敦煌抄本
- zoc for mac注册码
- redis简略版笔记
- vivado报错 syntax error、dout is an unknown type
热门文章
- 图片识别不了小程序怎么办_【信息素养】教你怎么用微信小程序进行文字识别...
- 【2022美赛F奖】B题:水电共享
- MATLAB建模与仿真(第一章基础--第四章画图)
- C# 通过窗口句柄为指定窗口发送指令(user32.dll,mshtml)
- Visio 2019 专业版安装教程
- My BlackBerry
- IATF16949认证辅导,FMEA和CP的顾客额外批准,对供应链安全的管理(适用时)
- 宽度学习(BLS)网络的研究和应用
- “飞客蠕虫”形成全球最大僵尸网络 每日感染数万网民
- 暴风一号 病毒 源码学习