【Lintcode】562. Backpack IV
题目地址:
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(lAm)。
考虑空间优化。由于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相关推荐
- 【Lintcode】92. Backpack
题目地址: https://www.lintcode.com/problem/backpack/description 背包问题.给定一个数组AAA代表每个物品的体积,和一个容积sss,问最多能塞满多 ...
- 【Lintcode】125. Backpack II
题目地址: http://www.lintcode.com/problem/backpack-ii/description 0−10-10−1背包问题,AAA表示物品体积,VVV表示物品价值,背包容量 ...
- 【LintCode】算法题 1443. 最长AB子串
描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...
- 【Lintcode】1382 · High Capacity Backpack
题目地址: https://www.lintcode.com/problem/1382/description 给定一个背包,容量sss,再给定nnn个物品,各自体积是c[i]c[i]c[i],各自价 ...
- 【LintCode】Backpack 背包问题
在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]. 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为11,可以选择[2, 3, 5]装入背包, ...
- 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连
解析 max ksubarray sum: 最大和 of 连续子序列 => 最大和 of k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff: 无queu ...
- 【Lintcode】1413. Tree
题目地址: https://www.lintcode.com/problem/tree/description 给定一个无向图,其有树性质,并且顶点编号为111的为树根(也就是这个图是个有根树).要求 ...
- 【Lintcode】1645. Least Subsequences
题目地址: https://www.lintcode.com/problem/1645/ 给定一个长nnn的数组AAA,问AAA最少能分解为多少个严格递减的子序列之并. 在AAA上定义偏序关系< ...
- 【Lintcode】1375. Substring With At Least K Distinct Characters
题目地址: https://www.lintcode.com/problem/substring-with-at-least-k-distinct-characters/description 给定一 ...
最新文章
- linux 安装分区设置分区大小
- java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector解决方法
- base64链接转为地址php,php将图片链接转换为base64编码文件流
- tp5 php7 报500,记一次TP单元测试报500错误的问题
- Git使用中的一些奇技淫巧
- 数据结构是如何装入 CPU 寄存器的?
- FAIR 何恺明、Piotr、Ross等新作,MAE才是YYDS!仅用ImageNet1K,Top-1准确率87.8%!
- Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取
- I.MX6 2G DDR3 16G eMMC
- git add未commit reset恢复文件
- Cypress 自定义方法命令
- CentOS 5.5安装 bluefish
- 用MMdetection训练测试自己的voc数据集
- Android神器:Xposed框架
- B2B企业越早做网络营销会有哪些优势 由上海添力张进老师讲解
- 阿里达摩院/字节后端研发一面凉面经
- Python实现爬取腾讯招聘网岗位信息
- 软件开发过程中的各种文档
- 【论文阅读】Blur Calibration for Depth from Defocus
- 高并发、高可用、高负载、分布式架构