动态规划学习:背包问题
backage
- 一、01背包
- 二、完全背包
一、01背包
- 给定一批物品的重量及价值,给定一个背包,在物品不超过背包的重量的情况下,找出最大价值,注意,物品都是单个的
代码实现
1、使用二维数组state[i][j]表示前i个物品重量为j的最大价值
package OneDaySuanFa;/*01背包问题:给定一批物品的重量及价值,给定一个背包,在物品不超过背包的重量的情况下,找出最大价值注意:物品都是单个的*/
public class backage01 {public static int backage01(int[] weight,int[] value,int n,int w){//weight数组表示物品重量;value数组表示物品价值;n表示物品个数;w表示背包重量int[][] state = new int[n][w+1]; //state[i][j]表示前i个物品装满总重量为j的背包的最大价值state[0][0] = 0;if (weight[0] <= w){state[0][weight[0]] = value[0];}for (int i = 1; i < n; i++){for (int j = 0; j <= w; j++) {if (weight[i] <= j){ //能放入的情况下//可以选择放入或者不放入,找出最大价值state[i][j] = Math.max(state[i-1][j-weight[i]] + value[i],state[i-1][j]);}else {//不能放入的情况下state[i][j] = state[i-1][j];}}}int maxvalue = 0;for (int i = 0; i <= w; i++){if (state[n-1][i] > maxvalue){maxvalue = state[n-1][i];}}return maxvalue;}public static void main(String[] args) {int[] weight = new int[]{1,2,3,4};int[] value = new int[]{2,4,4,2};System.out.println(backage01(weight,value,4,5));}
}
2、使用一维数组
//切换成一维数组public static int backage02(int[] weight,int[] value,int n,int w){int[] dp = new int[w+1]; //dp[i]表示装满重量为i的背包的最大价值dp[0] = 0;if (weight[0] <= w){dp[weight[0]] = value[0];}for (int i = 1; i < n; i++){//二维转为一维时,需要逆序遍历for (int j = w; j >= 0; j--){if (j >= weight[i]){dp[j] = Math.max(dp[j-weight[i]] + value[i],dp[j]);}else{dp[j] = dp[j];}}}int maxvalue = 0;for (int i = 0; i <= w; i++){if (dp[i] > maxvalue){maxvalue = dp[i];}}return maxvalue;}
二、完全背包
- 给定一批物品的重量及价值,给定一个背包,在物品不超过背包的重量的情况下,找出最大价值
注意:每个物品都有无限个
代码实现
package OneDaySuanFa;import java.util.Scanner;public class backageComplete {public static int backagecomplete(int[] weight,int[] value,int n,int w){//weight数组表示物品重量;value数组表示物品价值;n表示物品个数;w表示背包重量int[][] state = new int[n][w+1]; //state[i][j]表示前i个物品凑够总重量为j的最大价值for (int i = 0; i <= w / weight[0]; i++){state[0][i * weight[0]] = i * value[0];}for (int i = 1; i < n; i++){for (int j = 0; j <= w; j++){for (int k = 0; k <= w / weight[i]; k++){//这里k表示物品的个数,每个物品都可以放多个if (k * weight[i] <= j){ //放的下的情况,可以选择放或者不放state[i][j] = Math.max(state[i-1][j - k * weight[i]] + k * value[i],state[i][j]);//为什么不放会是state[i][j],不是state[i-1][j],因为物品可以放多个,不放可能是已经放了一个的情况}else {//放不下的情况state[i][j] = state[i][j];}}}}return state[n-1][w];}}
使用一维数组
public static int backagecomplete2(int[] weight,int[] value,int n,int w){int[] dp = new int[w+1]; //dp[i]表示重量为i的最大价值dp[0] = 0;for (int i = 0; i < n; i++){for (int j = weight[i]; j <= w; j++){dp[j] = Math.max(dp[j-weight[i]] + value[i],dp[j]);}}return dp[w];}
动态规划学习:背包问题相关推荐
- 【学习笔记整理】动态规划:背包问题之八大情况
[学习笔记整理]动态规划:背包问题之八大情况 一.01背包问题 二.完全背包问题 三.多重背包问题 四.混合背包问题 五.二维费用的背包问题 六.分组背包问题 七.背包问题求方案数 八.背包问题求具体 ...
- 动态规划学习记录:题型/思路汇总
#动态规划学习记录# 动态规划学习记录:题型/思路汇总 一维数组动态规划 1.爬楼梯 2.数硬币 3.最大子序和 4.区域和检索 - 数组不可变 5.整数拆分 6.打家劫舍 7.打家劫舍II 8.解码 ...
- Suzy心情很差因为被charge了late fee Day42 | 动态规划之背包问题,416. 分割等和子集
背包问题 01背包 Given n种物品,每种物品只有1个 每个物品有自己的重量.价值. 背包最大能装载的重量 动规五部曲--用二维数组 定义dp数组的含义:dp[ i ][ j ]表示[0,i]物品 ...
- 自适应动态规划学习笔记(3)
@TOC 自适应动态规划学习笔记(3) 第三天(图全是偷的) 图1 ADP的三个部分 Model Network 书接上回,图(1)中所示的Model Network就是对于系统公式(1)xk+1= ...
- 【算法与数据结构】—— 动态规划之背包问题
动态规划之背包问题 前面介绍了一些最常见的动态规划题型和对应解法,而实际上,动态规划最经典的题型非背包问题莫属,并且大多数人最初都是从背包问题入坑进而打开动态规划这一大门. 背包问题分为多种,其中最常 ...
- 动态规划之背包问题的一些基础简单入门题
前言 参考视频教程洛谷试练场 普及组 动态规划的背包问题 主要有01背包问题.完全背包问题.分组背包问题. 01背包问题一般从右往左推: 完全背包问题一般从左往右推: 分组背包一般用01的方法但需要记 ...
- c语言背包问题装字母,C语言动态规划之背包问题详解
01背包问题 给定n种物品,和一个容量为C的背包,物品i的重量是w[i],其价值为v[i].问如何选择装入背包的物品,使得装入背包中的总价值最大?(面对每个武平,只能有选择拿取或者不拿两种选择,不能选 ...
- 动态规划之背包问题——01背包
算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...
- 动态规划之背包问题(JAVA)
背包问题之前的C语言版本已经将思路解析的差不多,虽然还有些许错误需要改正,但大体思路是正确的,需要的读者请参阅动态规划之背包问题(C语言) 背包问题本身就是典型的动态规划问题,所以这里只给出动态规划的 ...
最新文章
- Python基本语法_运算符详解
- 深入研究Java类加载机制
- vue-cli 官方模板webpack-simple的npm run dev 与npm run bulid的一些问题
- 【学习笔记】30、Python基础综合练习
- vs.net 打开.xaml文件编辑界面_怎么保护可移动磁盘中的文件防止被删除
- 电信运营商计费模型_5G消息年底商用?三大运营商联合推出已有手机支持
- wizard generated application - how is detail page rendered
- 百分百储值卡回收网站源码+手机模板
- python语言名片管理系统,进行增删改查
- 双11 拼多多iPhone 11系列香气扑鼻:最高降幅达1600元
- 软件工程造价师有用吗?
- mac book usb 故障修复
- livezilla安装指南
- 编程c语言counter,c语言中计算平均分时,计数器(counter)的初始化
- python bi_这5款BI工具,Python工程师最爱用
- 魅族容器云平台基于Kubernetes自动化运维实践
- java for 代表什么意思_java中的for是什么意思
- Si基相控阵技术的相关进展1
- TabLayout+ViewPager+Fragment实现切页展示
- Redis高级应(2)-事务以及LUA脚本