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];}

动态规划学习:背包问题相关推荐

  1. 【学习笔记整理】动态规划:背包问题之八大情况

    [学习笔记整理]动态规划:背包问题之八大情况 一.01背包问题 二.完全背包问题 三.多重背包问题 四.混合背包问题 五.二维费用的背包问题 六.分组背包问题 七.背包问题求方案数 八.背包问题求具体 ...

  2. 动态规划学习记录:题型/思路汇总

    #动态规划学习记录# 动态规划学习记录:题型/思路汇总 一维数组动态规划 1.爬楼梯 2.数硬币 3.最大子序和 4.区域和检索 - 数组不可变 5.整数拆分 6.打家劫舍 7.打家劫舍II 8.解码 ...

  3. Suzy心情很差因为被charge了late fee Day42 | 动态规划之背包问题,416. 分割等和子集

    背包问题 01背包 Given n种物品,每种物品只有1个 每个物品有自己的重量.价值. 背包最大能装载的重量 动规五部曲--用二维数组 定义dp数组的含义:dp[ i ][ j ]表示[0,i]物品 ...

  4. 自适应动态规划学习笔记(3)

    @TOC 自适应动态规划学习笔记(3) 第三天(图全是偷的) 图1 ADP的三个部分 Model Network  书接上回,图(1)中所示的Model Network就是对于系统公式(1)xk+1= ...

  5. 【算法与数据结构】—— 动态规划之背包问题

    动态规划之背包问题 前面介绍了一些最常见的动态规划题型和对应解法,而实际上,动态规划最经典的题型非背包问题莫属,并且大多数人最初都是从背包问题入坑进而打开动态规划这一大门. 背包问题分为多种,其中最常 ...

  6. 动态规划之背包问题的一些基础简单入门题

    前言 参考视频教程洛谷试练场 普及组 动态规划的背包问题 主要有01背包问题.完全背包问题.分组背包问题. 01背包问题一般从右往左推: 完全背包问题一般从左往右推: 分组背包一般用01的方法但需要记 ...

  7. c语言背包问题装字母,C语言动态规划之背包问题详解

    01背包问题 给定n种物品,和一个容量为C的背包,物品i的重量是w[i],其价值为v[i].问如何选择装入背包的物品,使得装入背包中的总价值最大?(面对每个武平,只能有选择拿取或者不拿两种选择,不能选 ...

  8. 动态规划之背包问题——01背包

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...

  9. 动态规划之背包问题(JAVA)

    背包问题之前的C语言版本已经将思路解析的差不多,虽然还有些许错误需要改正,但大体思路是正确的,需要的读者请参阅动态规划之背包问题(C语言) 背包问题本身就是典型的动态规划问题,所以这里只给出动态规划的 ...

最新文章

  1. Python基本语法_运算符详解
  2. 深入研究Java类加载机制
  3. vue-cli 官方模板webpack-simple的npm run dev 与npm run bulid的一些问题
  4. 【学习笔记】30、Python基础综合练习
  5. vs.net 打开.xaml文件编辑界面_怎么保护可移动磁盘中的文件防止被删除
  6. 电信运营商计费模型_5G消息年底商用?三大运营商联合推出已有手机支持
  7. wizard generated application - how is detail page rendered
  8. 百分百储值卡回收网站源码+手机模板
  9. python语言名片管理系统,进行增删改查
  10. 双11 拼多多iPhone 11系列香气扑鼻:最高降幅达1600元
  11. 软件工程造价师有用吗?
  12. mac book usb 故障修复
  13. livezilla安装指南
  14. 编程c语言counter,c语言中计算平均分时,计数器(counter)的初始化
  15. python bi_这5款BI工具,Python工程师最爱用
  16. 魅族容器云平台基于Kubernetes自动化运维实践
  17. java for 代表什么意思_java中的for是什么意思
  18. Si基相控阵技术的相关进展1
  19. TabLayout+ViewPager+Fragment实现切页展示
  20. Redis高级应(2)-事务以及LUA脚本

热门文章

  1. 基于windows子系统WSL2搭建openharmony开发环境(图文详解)
  2. 如何延长笔记本电池寿命
  3. day12_面对对象思想 属性及方法(用心去揣摩)
  4. Unity 数据管理
  5. 在vue项目中实现 将数据导入Excel 三种方式(.xlsx , .csv)
  6. 在线能力测试题资源汇总
  7. 大数据时代智慧健康养老发展趋势
  8. iOS学习 —— 数据加密
  9. 软件开发可行性分析——健康食谱小程序
  10. 20200717-UML类图箭头