Java解洛谷P6771 [USACO05MAR]Space Elevator 太空电梯,包含完整的多重背包状态转移方程,大量注释,通俗易懂
01.题目及链接
题目链接:https://www.luogu.com.cn/problem/P6771
02.多重背包状态转移方程说明
了解多重背包
有 N 种物品和一个容量是 V 的背包,每种物品都有n[i]可用。第 i 种物品的重量是 w[i] 、价值是 v[i]。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。
状态转移方程
定义状态dp[i]:背包两种容量分别为j的情况下,物品的最大价值
for (int i = 1; i <= n; i++) //有N种物品for (int j = v; j>=0; j--) //容量vfor (int k = 1; k <= n[i]; k++) //第i个物品的数量为n[i]if(j>=k*w[i]) dp[j]=Math.max(dp[j], dp[j-k*w[i]]+k*v[i]);
或
for (int i = 1; i <= n; i++) //有N种物品for (int k = 1; k <= n[i]; k++) //第i个物品的数量为n[i]for (int j = v; j >= w[i]; j--) //容量vdp[j]=Math.max(dp[j], dp[j-w[i]]+v[i]);
03.具体代码
解题思路:
- 根据限制进行排序(从小到大)
- 根据状态转移方程进行DP
DP写法1
public static void main(String[] args) {Scanner in=new Scanner(System.in);int n=in.nextInt();int[][] input=new int[n+1][3];int maxLimit=0;//最大限制for (int i = 1; i <= n; i++) {input[i][0]=in.nextInt();//高度input[i][1]=in.nextInt();//限制input[i][2]=in.nextInt();//数量maxLimit=Math.max(maxLimit, input[i][1]);}Arrays.sort(input,(o1,o2)->o1[1]-o2[1]);//根据限制进行排序(从小到大)int max=0;int[] dp=new int[maxLimit+1]; for (int i = 1; i <= n; i++) {for (int k = 1; k <= input[i][2]; k++) {for (int j = input[i][1]; j >= input[i][0]; j--) {dp[j]=Math.max(dp[j], dp[j-input[i][0]]+input[i][0]);max=Math.max(dp[j], max);}}}System.out.println(max);}
DP写法2
public static void main(String[] args) {Scanner in=new Scanner(System.in);int n=in.nextInt();int[][] input=new int[n+1][3];int maxLimit=0;for (int i = 1; i <= n; i++) {input[i][0]=in.nextInt();//高度input[i][1]=in.nextInt();//限制input[i][2]=in.nextInt();//数量maxLimit=Math.max(maxLimit, input[i][1]); }Arrays.sort(input,(o1,o2)->o1[1]-o2[1]);int max=0;int[] dp=new int[maxLimit+1]; for (int i = 1; i <= n; i++) {for (int j = input[i][1]; j >= 0; j--) {for (int k = 1; k <= input[i][2]; k++) {if(j>=k*input[i][0]) {dp[j]=Math.max(dp[j], dp[j-k*input[i][0]]+k*input[i][0]);max=Math.max(dp[j], max);}}}}System.out.println(max);}
04.更多背包学习
https://blog.csdn.net/qq_46237746/article/details/123908504
Java解洛谷P6771 [USACO05MAR]Space Elevator 太空电梯,包含完整的多重背包状态转移方程,大量注释,通俗易懂相关推荐
- Java 解洛谷PP5322 [BJOI2019] 排兵布阵,包含完整的分组背包状态转移方法说明,通俗易懂
01.题目及链接 题目链接:https://www.luogu.com.cn/problem/P5322 02.分组背包说明 分组背包:有k组物品,N个物品,一个容量是C的背包.每组物品有若干个,同一 ...
- 洛谷P6771 [USACO05MAR]Space Elevator 太空电梯
题目描述 奶牛们要去太空了!它们打算用方块建造一座太空电梯.现在它们有 N种方块,第 i种方块有一个特定的高度 h[i],一定的数量 c[i].为了防止宇宙射线破坏方块,第 i种方块的任何部分不能 ...
- P6771 [USACO05MAR]Space Elevator 太空电梯-贪心与DP
题目链接[USACO05MAR]Space Elevator 太空电梯 - 洛谷 题目描述 奶牛们要去太空了!它们打算用方块建造一座太空电梯.现在它们有 NN 种方块,第 ii 种方块有一个特定的高度 ...
- P6771 [USACO05MAR]Space Elevator 太空电梯 题解
[USACO05MAR]Space Elevator 太空电梯 description: 奶牛们要去太空了!它们打算用方块建造一座太空电梯.现在它们有 种方块,第 种方块有一个特定的高度 ,一定的数量 ...
- c++ 多重背包状态转移方程_动态规划入门——详解经典问题零一背包
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是周三算法与数据结构专题的第12篇文章,动态规划之零一背包问题. 在之前的文章当中,我们一起探讨了二分.贪心.排序和搜索算法,今天我们来 ...
- [背包DP]Space Elevator 太空电梯
[背包DP]Space Elevator 太空电梯 题面 题目描述 输入 输出 样例 解析 代码 题面 题目描述 奶牛们要去太空了!它们打算用方块建造一座太空电梯.现在它们有 NN 种方块,第 ii ...
- 【洛谷】P6771 Space Elevator 太空电梯***(多重背包)
穿越隧道 没有理清所限制的高度之间的关系. 需要反复理解. #include <bits/stdc++.h> using namespace std; const int N = 1e3 ...
- Java实现洛谷 P1428 小鱼比可爱
题目描述 人比人,气死人:鱼比鱼,难死鱼.小鱼最近参加了一个"比可爱"比赛,比的是每只鱼的可爱程度.参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只 ...
- 洛谷 P1164 小A点菜(01背包状态转移方程详细推导)
题目链接 今天刷题,本来背包问题感觉稳稳的懒得刷了,随手做两个就被卡住了, 原来自己只会做死板的背包,这种稍微变形的就不会推状态转移方程了 我又去看了一眼滚动背包的转变方法 加上大佬的题解,才稍微明白 ...
最新文章
- 【FFmpeg】FFmpeg常用基本命令
- python——正则表达式
- html文档的基本类型,HTML(网页的文档类型介绍)
- 高通modem启动过程_苹果首次承认正自研基带芯片,高通要被抛弃了?
- Flash--元件和实例
- java生成图片url_Java Springboot如何基于图片生成下载链接
- STM32F103基本定时器使用
- LOAD-OF-PROGRAM
- python正则表达式 身份证_python3中6种常用正则表达式
- Mybatis中的collection和association一关系
- Java基础篇:短路逻辑运算符
- ads1110程序实测好用
- 防火墙结构之屏蔽主机体系结构
- 防火墙和代理服务器之间有什么区别
- problem: ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited with state
- 如何预防 XSS 攻击
- 手把手从0打造电商平台前端
- Rime默认为英文状态
- matlab, 生成一个数值一样的n维列向量
- CSGO DIY-文件修改位置