背包九讲 ----- 01背包问题模版
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背包问题模版相关推荐
- 背包九讲之一:01背包问题
文章目录 说明: 01背包问题 题目 基本思路 初始化的细节问题 优化空间复杂度 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添 ...
- 背包九讲之二:完全背包问题
文章目录 说明: 完全背包问题 题目 基本思路 一个简单有效的优化 相关题目练习 题目URL 输入格式 输出格式 数据范围 输入样例 输出样例: 题目解法 说明: 本文所讲内容摘录自崔添翼:背包九讲, ...
- 完全背包问题python_令人头疼的背包九讲(2)完全背包问题
重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题. 题目 完全背包问题 题目要求 有n ...
- dd大牛的背包九讲-背包问题汇总
背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...
- 背包问题——背包九讲
本帖主要为转载,只是供我学习,如有侵权,请联系我删除. 前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名 ...
- 背包九讲 (蒟蒻版)之01背包
hello,你们的loony上线啦.你们知道吗?我今天早上起来一看手机,600多人在CSDN上访问过我,当时我心情都要炸了(补充:高兴炸了),因为,这毕竟只是本蒟蒻的梦想嘛~ 好了不嘚瑟啦! 今天就来 ...
- 第二讲 完全背包问题(对背包九讲的学习)
学习自:背包九讲 题目 有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. ...
- 【算法】动态规划+“背包九讲”原理超详细讲解+常见dp问题(9种)总结
目录 一.动态规划(DP) 二.背包九讲 (1)完全背包 P1616 疯狂的采药(完全背包) (2)01背包 滚动数组 一维数组 P1048 采药(01背包) 01背包表格图示 (3)多重背包 整数拆 ...
- dp背包九讲(待补充,暂时前两讲)
文章目录 背包九讲 一.01背包 二维dp 优化为一维 二.完全背包 二维dp 优化为一维 三.多重背包 数据范围很小时,变成01背包暴力 当数据范围较大时,利用二进制优化 二进制优化还不够用时,利用 ...
最新文章
- 算法-打印一个字符串的全部子序列,包括空字符串
- DIV+CSS常见问题的14条原因分析
- 常考数据结构与算法:找到字符串的最长无重复字符子串
- c++中extern,static,const关键字的作用
- 网易云携手美云智数掀起企业移动信息化发展新浪潮
- 树莓派2+无线网卡=钓鱼热点
- 尝试:Script Lab,快速 O365 开发工具//SL01)
- Android之滑动事件冲突解决 Touch事件处理机制总结
- java canvas画圆圈_java – 在视图上绘制一个圆圈(android)
- 信息学奥赛一本通(1204:爬楼梯)
- licens 问题 Error (292028): Specified license is not valid for this machine
- Word一行排列多个图片并插入题注
- idea toggle offline mode
- 读书笔记-财务报表资本结构分析
- 解决 shiro 多次调用 redis 的问题
- db 分贝 增益 什么意思 多少倍
- 同一个网段win10远程linux,Win10专业版系统在局域网内远程另外一台电脑教程
- 决策树及输出结果解释
- 网络层(三)构成超网
- 统计学中数据分析方法大全
热门文章
- MOOS学习笔记3——命令行
- maven依赖包和依赖仓库(1)
- 浮点数比较大小的时候不能直接用等号
- 我搭建Wiki网站的步骤
- DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016,表挂起
- Windows域策略 设置客户端服务启动状态 【全域策略生效】
- [转]linux常用命令学习总结(超详细)
- 学数据分析究竟要懂哪些统计学?全都给你梳理好了,拿走不谢
- 掌握这个套路,让你的可视化大屏万里挑一
- linux服务器i o模型,高性能服务器框架--I/O模型