【LintCode】Backpack 背包问题
在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]。
样例
如果有4个物品[2, 3, 5, 7]
如果背包的大小为11,可以选择[2, 3, 5]装入背包,最多可以装满10的空间。
如果背包的大小为12,可以选择[2, 3, 7]装入背包,最多可以装满12的空间。
函数需要返回最多能装满的空间大小。
注意
你不可以将物品进行切割。
举例:
如果有4个物品[2, 3, 5, 7],如果背包的大小为11。问最多能装多满?
建动态规划数组 dp[A.length][m + 1],A.length行,m+1列
start | j = 0 | j = 1 | j = 2 | j = 3 | j = 4 | j = 5 | j = 6 | j = 7 | j = 8 | j = 9 | j = 10 | j = 11 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
i = 0 (A[0]=2) | dp[0][0] = 0 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
i = 1 (A[1]=3) | 0 | 0 | 2 | 3 | 3 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
i = 2 (A[2]=5) | 0 | 0 | 2 | 3 | 3 | 5 | 5 | 7 | 8 | 8 | 10 | 10 |
i = 3 (A[3]=7) | 0 | 0 | 2 | 3 | 3 | 5 | 5 | 7 | 8 | 9 | 10 | 10 |
dp[i][j]为当背包总重量为j且有前i个物品时,背包最多装满dp[i][j]的空间。
状态转移方程为:dp[i][j] = Math.max(dp[i - 1][j - A[i]] + A[i], dp[i-1][j]);
dp[i - 1][j - A[i]] + A[i]为加入第i个物品后背包的总装满空间。
a.为了把第i个物品放进背包,背包当然要先腾出至少A[i]的空间,腾出后空间的最多装满空间为dp[ i - 1][j - A[i]],再加上第i个物品的空间A[i],即为当背包总空间为j时,装入第i个物品背包的总装满空间。
b.当然第i个物品所占的空间可能比此时背包的总空间j要大(j < A[i]),此时装不进第i个物品,因此此时背包的总装满空间为dp[i-1][j]。
c.还有一种可能的情形是,虽然第i个物品能够装入包中,但为了把第i个物品装入而拿出了其他物品,使此时的总装入空间dp[i-1][j-A[i]] + A[i] < dp[i-1][j]
其他情形:
当j = 0时,dp[i][0] = 0
原题答案即为dp[3][11] = 10,背包的总空间为11时,四个物品能够装入的最大空间为多大。
public class Solution {/*** @param m: An integer m denotes the size of a backpack* @param A: Given n items with size A[i]* @return: The maximum size*/public int backPack(int m, int[] A) {int[][] dp = new int[A.length][m + 1];//动态规划矩阵for(int i = 0; i < A.length; i ++) {//背包空间为0时,不管要放第几个物品,可装满的背包空间为0.dp[i][0] = 0;}for(int j = 1; j < m + 1; j++) {if(A[0] <= j) {//当第0个物品的空间小于等于当前背包空间j时dp[0][j] = A[0];//背包可装满的最大空间是第0个物品的体积}else {//当第0个物品的空间大于当前背包空间j时dp[0][j] = 0;//背包可装满的最大空间是0}for(int i = 1; i < A.length; i++) {//当放第1个到第A.length-1个物品时if(A[i] > j) {//若该物品所占空间大于背包总空间(无论怎样腾背包空间,该物品无法放入背包dp[i][j] = dp[i - 1][j];//背包可装满的最大空间不变}else {//若该物品所占空间小于等于背包总空间,则需将背包空间腾出至少A[i]后,将该物品放入。放入新物品后背包最大可装满空间可能更大,也可能变小大,取大值作为背包空间为j且放第i个物品时可以有的最大可装满空间。dp[i][j] = Math.max(dp[i-1][j - A[i]] + A[i], dp[i - 1][j]);}}}return dp[A.length - 1][m];}
}
【LintCode】Backpack 背包问题相关推荐
- LintCode 92.背包问题
描述 在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i] 样例 样例 1:输入: [3,4,8,5], backpack size=10输出: 9样例 2:输 ...
- lintcode backpack
Given n items with size A[i], an integer m denotes the size of a backpack. How full you can fill thi ...
- LeetCode BackPack 背包问题
//从上个月末之后就开始有点浮躁起来,本来计划国庆查漏补缺的,结果网卡光荣的坏了ORZ--无论如何,OFFER现在还没有拿到,即便是拿到了也不该放松学习的状态.Stay Hungry,Stay Foo ...
- LintCode 563. 背包问题 V(DP)
1. 题目 给出 n 个物品, 以及一个数组, nums[i] 代表第i个物品的大小, 保证大小均为正数, 正整数 target 表示背包的大小, 找到能填满背包的方案数. 每一个物品只能使用一次 样 ...
- LintCode 125. 背包问题 II(DP)
1. 题目 有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小 数组 V 表示每个物品的价值. 问最多能装入背包的总价值是多大? 样例 1: 输入: m = 10, A = [ ...
- LintCode解题目录
看见 LintCode 的代码能力测试CAT(Coding Ability Test)挺好,有倒计时,挺有面试紧迫感.做个记录. 另有本人 LeetCode解题目录.<程序员面试金典>解题 ...
- 今天老夫就把完全背包的底裤给你扒出来瞅瞅!!!
来我房里有些好康的,来看看完全背包的底裤 完全背包 双重for循环遍历顺序再探 C++测试代码 总结 最后再啰嗦一下,稍微总结一下完全背包需要的注意事项 完全背包 有N件物品和一个最多能背重量为W的背 ...
- [cryptoverse CTF 2023] crypto部分
没打,完事作作题. Warmup 1 Decode the following ciphertext: GmvfHt8Kvq16282R6ej3o4A9Pp6MsN. Remember: CyberC ...
- 【Lintcode】125. Backpack II
题目地址: http://www.lintcode.com/problem/backpack-ii/description 0−10-10−1背包问题,AAA表示物品体积,VVV表示物品价值,背包容量 ...
最新文章
- python开源商城_Leaf - 一个开发友好、功能完备的开源微信商城框架
- CAD二次开发学习笔记二(创建一个对话框)
- 来电通java版_终于有人把Java程序员必学知识点整理出来了,令人有如醍醐灌顶...
- 网易云音乐音视频算法的 Serverless 探索之路
- 计算机核心配件是什么,计算机的核心是什么
- Nexus:一站式私有仓库管理(NuGet、Maven、npm、Docker)
- 【LeArm】动手实践机械臂(一)
- tensorflow之add_n
- OSPF建立邻居、邻接关系 学习笔记
- c# owc11 双Y轴
- 《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式...
- 15 使用计算机应遵守行业道德规范,信息会考答案~没考的看下!
- UiPath PDF拆分
- 图像分割算法的优缺点比较
- 内网,外网ip(路由器ip,公网ip)的分别以及如何查询
- 如何在shell中实现 backspace
- .netcore基础知识(一)
- mfc中如何使用全局变量进行数据共享
- 确定位数的C语言程序设计,c语言程序设计
- Prolific PL2303 usb 转串口Win8 Win8.1驱动