在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 背包问题相关推荐

  1. LintCode 92.背包问题

    描述 在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i] 样例 样例 1:输入: [3,4,8,5], backpack size=10输出: 9样例 2:输 ...

  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 ...

  3. LeetCode BackPack 背包问题

    //从上个月末之后就开始有点浮躁起来,本来计划国庆查漏补缺的,结果网卡光荣的坏了ORZ--无论如何,OFFER现在还没有拿到,即便是拿到了也不该放松学习的状态.Stay Hungry,Stay Foo ...

  4. LintCode 563. 背包问题 V(DP)

    1. 题目 给出 n 个物品, 以及一个数组, nums[i] 代表第i个物品的大小, 保证大小均为正数, 正整数 target 表示背包的大小, 找到能填满背包的方案数. 每一个物品只能使用一次 样 ...

  5. LintCode 125. 背包问题 II(DP)

    1. 题目 有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小 数组 V 表示每个物品的价值. 问最多能装入背包的总价值是多大? 样例 1: 输入: m = 10, A = [ ...

  6. LintCode解题目录

    看见 LintCode 的代码能力测试CAT(Coding Ability Test)挺好,有倒计时,挺有面试紧迫感.做个记录. 另有本人 LeetCode解题目录.<程序员面试金典>解题 ...

  7. 今天老夫就把完全背包的底裤给你扒出来瞅瞅!!!

    来我房里有些好康的,来看看完全背包的底裤 完全背包 双重for循环遍历顺序再探 C++测试代码 总结 最后再啰嗦一下,稍微总结一下完全背包需要的注意事项 完全背包 有N件物品和一个最多能背重量为W的背 ...

  8. [cryptoverse CTF 2023] crypto部分

    没打,完事作作题. Warmup 1 Decode the following ciphertext: GmvfHt8Kvq16282R6ej3o4A9Pp6MsN. Remember: CyberC ...

  9. 【Lintcode】125. Backpack II

    题目地址: http://www.lintcode.com/problem/backpack-ii/description 0−10-10−1背包问题,AAA表示物品体积,VVV表示物品价值,背包容量 ...

最新文章

  1. python开源商城_Leaf - 一个开发友好、功能完备的开源微信商城框架
  2. CAD二次开发学习笔记二(创建一个对话框)
  3. 来电通java版_终于有人把Java程序员必学知识点整理出来了,令人有如醍醐灌顶...
  4. 网易云音乐音视频算法的 Serverless 探索之路
  5. 计算机核心配件是什么,计算机的核心是什么
  6. Nexus:一站式私有仓库管理(NuGet、Maven、npm、Docker)
  7. 【LeArm】动手实践机械臂(一)
  8. tensorflow之add_n
  9. OSPF建立邻居、邻接关系 学习笔记
  10. c# owc11 双Y轴
  11. 《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式...
  12. 15 使用计算机应遵守行业道德规范,信息会考答案~没考的看下!
  13. UiPath PDF拆分
  14. 图像分割算法的优缺点比较
  15. 内网,外网ip(路由器ip,公网ip)的分别以及如何查询
  16. 如何在shell中实现 backspace
  17. .netcore基础知识(一)
  18. mfc中如何使用全局变量进行数据共享
  19. 确定位数的C语言程序设计,c语言程序设计
  20. Prolific PL2303 usb 转串口Win8 Win8.1驱动

热门文章

  1. chromedriver镜像
  2. adb 查看指定APP日志
  3. jsplumb 系列(一)
  4. RxSwift--RxSwift简介
  5. Eclipse SVN文件对比详解
  6. 【Hadoop HA】搭建Hadoop HA的详细教程
  7. 30天自制操作系统:第一天
  8. 结构体构造和析构函数
  9. 4、数据库服务的启动与登录
  10. 转录因子详细介绍(motif)