当前位置: 首页 > news >正文

Leetcode-day31-01背包问题

46. 携带研究材料

1.dp数组代表的是什么? 这里的dp数组是一个二维数组,dp[i][j]是从前i个物品中任选放入容量j内的最大价值。

2.递推公式。

  • 不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。

  • 放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值

递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

3.dp数组初始化:dp数组的第一列,也就是容量为0,此时都是0。dp数组的第一行,也就是把第0个物品放入,此时前面都是0(放不进去的时候),直到能放进去了变为value[i]。

4.遍历方向,外层是背包或者外层是物品都可以

5.打印dp数组,最右下角的元素

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int bagweight = scanner.nextInt();int[] weight = new int[n];int[] value = new int[n];for (int i = 0; i < n; ++i) {weight[i] = scanner.nextInt();}for (int j = 0; j < n; ++j) {value[j] = scanner.nextInt();}int[][] dp = new int[n][bagweight + 1];for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];}for (int i = 1; i < n; i++) {for (int j = 0; j <= bagweight; j++) {if (j < weight[i]) {dp[i][j] = dp[i - 1][j];} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}}}System.out.println(dp[n - 1][bagweight]);}
}

 


http://www.mrgr.cn/news/7661.html

相关文章:

  • 开源原型设计工具Penpot
  • 缓存实现方式
  • 从源码开始:在线教育系统与网校APP的架构设计与开发实践
  • Android Studio修改默认.m2与Gradle user home缓存位置
  • 垃圾分类笔记YOLOV5(一)-pip换源-口罩识别-训练自己的数据集
  • 宝塔面板配置node/npm/yarn/pm2....相关全局变量 npm/node/XXX: command not found
  • Spring中ConfigurableListableBeanFactory
  • 简单使用scratch镜像
  • 数据增强常见方法汇总
  • NoSQL之Redis配置与优化
  • pyintaller pyqt5 pytest打包后 找不到测试实例
  • 【正点原子K210连载】第三十二章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • leetcode 438 找到字符串中所有字母异位词
  • 使用Python+winshell/shutil清空回收站
  • QML 界面切换的方法
  • Vue.js学习笔记(七)使用sortablejs或el-table-draggable拖拽ElementUI的el-table表格组件
  • C#高效异步文件监控与日志记录工具
  • node npm nvm 地址
  • 【Qt】输入类控件QDail
  • Python算法工程师面试整理-数据结构