题目地址:

https://www.lintcode.com/problem/backpack-iv/description

给定一个数组AAA,代表每个物品的体积,题目保证AAA里的数全是正数并且没有重复。再给定一个容积mmm,问能塞满这个容积的物品组合的方案数。每个物品可以用无限次。

思路是动态规划。将一个方案与一个上升序列做一一对应,例如,某个方案是A[0]A[0]A[0]取222个,A[1]A[1]A[1]取111个,A[3]A[3]A[3]取222个,那么这个方案可以表示为(0,0,1,3,3)(0,0,1,3,3)(0,0,1,3,3)。也就是将选取的每个物品的下标做成一个单调增序列。设f[i][j]f[i][j]f[i][j]是只选A[0:i]A[0:i]A[0:i]的物品,要填满体积jjj的方案数。那么可以按照方案所对应的序列的最后一个数字做分类,如果最后一个数字恰好是iii,意思是这个方案包含A[i]A[i]A[i],那么此时的方案数是f[i][j−A[i]]f[i][j-A[i]]f[i][j−A[i]];如果最后一个数字不是iii,那么此时方案数是f[i−1][j]f[i-1][j]f[i−1][j],所以有:f[i][j]=f[i][j−A[i]]+f[i−1][j]f[i][j]=f[i][j-A[i]]+f[i-1][j]f[i][j]=f[i][j−A[i]]+f[i−1][j]边界条件:f[0][j]={1,A[0]∣j0,A[0]∤jf[0][j]=\begin{cases} 1,A[0]|j\\0, A[0]\nmid j \end{cases}f[0][j]={1,A[0]∣j0,A[0]∤j​注意到递推式,f[i]f[i]f[i]在更新的时候一定要按照jjj递增的顺序更新,因为f[i][j]f[i][j]f[i][j]是依赖f[i][j−A[i]]f[i][j-A[i]]f[i][j−A[i]]的。代码如下:

public class Solution {/*** @param nums: an integer array and all positive numbers, no duplicates* @param target: An integer* @return: An integer*/public int backPackIV(int[] nums, int target) {// write your code hereif (nums == null || nums.length == 0) {return 0;}int[][] dp = new int[nums.length][target + 1];for (int i = 0; i * nums[0] <= target; i++) {dp[0][i * nums[0]] = 1;}for (int i = 1; i < nums.length; i++) {for (int j = 0; j <= target; j++) {dp[i][j] = dp[i - 1][j];if (j >= nums[i]) {dp[i][j] += dp[i][j - nums[i]];}}}return dp[nums.length - 1][target];}
}

时空复杂度O(lAm)O(l_Am)O(lA​m)。

考虑空间优化。由于f[i][j]f[i][j]f[i][j]只依赖其正上方一行和其左边的值,所以可以考虑在更新的时候直接覆盖到原数组上。但是需要注意,一定要从左向右更新,因为f[i][j]f[i][j]f[i][j]是依赖f[i][j−A[i]]f[i][j-A[i]]f[i][j−A[i]]的。代码如下:

public class Solution {/*** @param nums: an integer array and all positive numbers, no duplicates* @param target: An integer* @return: An integer*/public int backPackIV(int[] nums, int target) {// write your code hereif (nums == null || nums.length == 0) {return 0;}int[] dp = new int[target + 1];for (int i = 0; i * nums[0] <= target; i++) {dp[i * nums[0]] = 1;}for (int i = 1; i < nums.length; i++) {// 按照j递增的顺序更新for (int j = 0; j <= target; j++) {if (j >= nums[i]) {dp[j] += dp[j - nums[i]];}}}return dp[target];}
}

时间复杂度不变,空间O(m)O(m)O(m)。

【Lintcode】562. Backpack IV相关推荐

  1. 【Lintcode】92. Backpack

    题目地址: https://www.lintcode.com/problem/backpack/description 背包问题.给定一个数组AAA代表每个物品的体积,和一个容积sss,问最多能塞满多 ...

  2. 【Lintcode】125. Backpack II

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

  3. 【LintCode】算法题 1443. 最长AB子串

    描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...

  4. 【Lintcode】1382 · High Capacity Backpack

    题目地址: https://www.lintcode.com/problem/1382/description 给定一个背包,容量sss,再给定nnn个物品,各自体积是c[i]c[i]c[i],各自价 ...

  5. 【LintCode】Backpack 背包问题

    在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]. 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为11,可以选择[2, 3, 5]装入背包, ...

  6. 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连

    解析 max ksubarray sum:  最大和 of 连续子序列 =>   最大和 of  k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff:  无queu ...

  7. 【Lintcode】1413. Tree

    题目地址: https://www.lintcode.com/problem/tree/description 给定一个无向图,其有树性质,并且顶点编号为111的为树根(也就是这个图是个有根树).要求 ...

  8. 【Lintcode】1645. Least Subsequences

    题目地址: https://www.lintcode.com/problem/1645/ 给定一个长nnn的数组AAA,问AAA最少能分解为多少个严格递减的子序列之并. 在AAA上定义偏序关系< ...

  9. 【Lintcode】1375. Substring With At Least K Distinct Characters

    题目地址: https://www.lintcode.com/problem/substring-with-at-least-k-distinct-characters/description 给定一 ...

最新文章

  1. linux 安装分区设置分区大小
  2. java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector解决方法
  3. base64链接转为地址php,php将图片链接转换为base64编码文件流
  4. tp5 php7 报500,记一次TP单元测试报500错误的问题
  5. Git使用中的一些奇技淫巧
  6. 数据结构是如何装入 CPU 寄存器的?
  7. FAIR 何恺明、Piotr、Ross等新作,MAE才是YYDS!仅用ImageNet1K,Top-1准确率87.8%!
  8. Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
  9. I.MX6 2G DDR3 16G eMMC
  10. git add未commit reset恢复文件
  11. Cypress 自定义方法命令
  12. CentOS 5.5安装 bluefish
  13. 用MMdetection训练测试自己的voc数据集
  14. Android神器:Xposed框架
  15. B2B企业越早做网络营销会有哪些优势 由上海添力张进老师讲解
  16. 阿里达摩院/字节后端研发一面凉面经
  17. Python实现爬取腾讯招聘网岗位信息
  18. 软件开发过程中的各种文档
  19. 【论文阅读】Blur Calibration for Depth from Defocus
  20. 高并发、高可用、高负载、分布式架构

热门文章

  1. 如何使用几何体画人体结构?几何体画人体结构技巧!
  2. 复数中的运算符重载(续)
  3. springboot+springm vc+mybatis实现增删改查案例!
  4. 北航图像信号处理matlab实验,北航动态建模实验报告(matlab界面、动画).pdf
  5. SNP芯片探针回帖基因序列
  6. Chp1-1 数据结构的基本概念
  7. Less简介——CSS
  8. 9.二重循环:什么是二重循环???
  9. 富士康再出击,富连网何以定义新电商?
  10. 【转载】清华毕业致辞:从容行走于无人知晓的荒原,欣赏并创造别样的风景...