01背包问题

题意
  • 给定N件物品和一个容量为V的背包
  • 每件物品具有价值和体积两个属性,且每件物品选择次数小于等于1
  • 计算出背包所能够存放的最大价值
题解(二维dp)
  • 用 f[i][j]f[i][j]f[i][j] 表示只看前 iii 个物品,背包容积为 jjj 时,背包能存放的最大价值

  • 那么 ans=ans=ans=maxmaxmax { f[N][0f[N][0f[N][0 ~ V]V]V] }

  • 用 v[i]v[i]v[i] 和 w[i]w[i]w[i] 分别表示第 iii 个物品的 体积 和 价值

  • f[i][j]f[i][j]f[i][j] 的状态转移:

    • 当没有选到第 iii 个物品进背包时:此时看前 iii 个物品且背包容积为 jjj 时背包能存放的最大价值等价于看前 i−1i-1i−1 个物品且背包容积为 jjj 时背包能存放的最大价值,即 f[i][j]=f[i−1][j]f[i][j]=f[i - 1][j]f[i][j]=f[i−1][j]
    • 当选到了第 iii 个物品进背包时:此时看前 iii 个物品且背包容积为 jjj 时背包能存放的最大价值等价于看前 i−1i-1i−1 个物品且背包容积为 j−v[i]j-v[i]j−v[i] (v[i]为背包中已经占用的体积) 时背包能存放的最大价值加上 w[i]w[i]w[i] (背包中已经存在的物品的价值) ,即 f[i][j]=f[i−1][j−v[i]]+w[i]f[i][j]=f[i-1][j - v[i]] + w[i]f[i][j]=f[i−1][j−v[i]]+w[i]
    • f[i][j]=f[i][j]=f[i][j]=上面两种状态取值最大的那一个
  • 复杂度分析:

    • 时间复杂度:遍历了一个二维数组 N(mn)N(mn)N(mn)
    • 空间复杂度:一个二维数组 N(mn)N(mn)N(mn)
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 物品数量int N = scanner.nextInt();// 背包容积int V = scanner.nextInt();// 记录每个物品的体积和价值int[] v = new int[N + 1], w = new int[N + 1];// 输入数据for (int i = 1; i <= N; i++) {v[i] = scanner.nextInt();w[i] = scanner.nextInt();}// 下面是二维dp// f[i][j] 表示只看前 i 个物品,背包容积为 j 时,背包能存放的最大价值int[][] f = new int[N + 1][V + 1];// f[i][j] 数据初始化f[0][0] = 0;// 这一步可以省略// f[i][j] 状态转移for (int i = 1; i <= N; i++) {for (int j = 0; j <= V; j++) {// 当没有选到第 i 个物品进背包时f[i][j] = f[i - 1][j];// 当选到了第 i 个物品进背包时if (j >= v[i]) f[i][j] = Math.max(f[i][j], f[i - 1][j - v[i]] + w[i]);}}int ans = 0;//  ans = max { f[N][0 ~ V] }for (int j = 0; j <= V; j++)ans = Math.max(ans, f[N][j]);System.out.println(ans);}
}
优化
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 物品数量int N = scanner.nextInt();// 背包容积int V = scanner.nextInt();// 记录每个物品的体积和价值int[] v = new int[N + 1], w = new int[N + 1];// 输入数据for (int i = 1; i <= N; i++) {v[i] = scanner.nextInt();w[i] = scanner.nextInt();}int[] f = new int[V + 1];for (int i = 1; i <= N; i++) {for (int j = V; j >= v[i]; j--) {f[j] = Math.max(f[j], f[j - v[i]] + w[i]);}}System.out.println(f[V]);}
}

背包九讲 ----- 01背包问题模版相关推荐

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

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

  2. 背包九讲之二:完全背包问题

    文章目录 说明: 完全背包问题 题目 基本思路 一个简单有效的优化 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添翼:背包九讲, ...

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

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

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

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

  5. 背包问题——背包九讲

    本帖主要为转载,只是供我学习,如有侵权,请联系我删除. 前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名 ...

  6. 背包九讲 (蒟蒻版)之01背包

    hello,你们的loony上线啦.你们知道吗?我今天早上起来一看手机,600多人在CSDN上访问过我,当时我心情都要炸了(补充:高兴炸了),因为,这毕竟只是本蒟蒻的梦想嘛~ 好了不嘚瑟啦! 今天就来 ...

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

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

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

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

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

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

最新文章

  1. 算法-打印一个字符串的全部子序列,包括空字符串
  2. DIV+CSS常见问题的14条原因分析
  3. 常考数据结构与算法:找到字符串的最长无重复字符子串
  4. c++中extern,static,const关键字的作用
  5. 网易云携手美云智数掀起企业移动信息化发展新浪潮
  6. 树莓派2+无线网卡=钓鱼热点
  7. 尝试:Script Lab,快速 O365 开发工具//SL01)
  8. Android之滑动事件冲突解决 Touch事件处理机制总结
  9. java canvas画圆圈_java – 在视图上绘制一个圆圈(android)
  10. 信息学奥赛一本通(1204:爬楼梯)
  11. licens 问题 Error (292028): Specified license is not valid for this machine
  12. Word一行排列多个图片并插入题注
  13. idea toggle offline mode
  14. 读书笔记-财务报表资本结构分析
  15. 解决 shiro 多次调用 redis 的问题
  16. db 分贝 增益 什么意思 多少倍
  17. 同一个网段win10远程linux,Win10专业版系统在局域网内远程另外一台电脑教程
  18. 决策树及输出结果解释
  19. 网络层(三)构成超网
  20. 统计学中数据分析方法大全

热门文章

  1. MOOS学习笔记3——命令行
  2. maven依赖包和依赖仓库(1)
  3. 浮点数比较大小的时候不能直接用等号
  4. 我搭建Wiki网站的步骤
  5. DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016,表挂起
  6. Windows域策略 设置客户端服务启动状态 【全域策略生效】
  7. [转]linux常用命令学习总结(超详细)
  8. 学数据分析究竟要懂哪些统计学?全都给你梳理好了,拿走不谢
  9. 掌握这个套路,让你的可视化大屏万里挑一
  10. linux服务器i o模型,高性能服务器框架--I/O模型