【Lintcode】92. Backpack
题目地址:
https://www.lintcode.com/problem/backpack/description
背包问题。给定一个数组AAA代表每个物品的体积,和一个容积sss,问最多能塞满多少容积。
思路是动态规划。设f[i][j]f[i][j]f[i][j]是从A[0:i]A[0:i]A[0:i]这些物品里选,要塞进容积jjj,最多能塞多少容积。那么有两种情况:
1、不放A[i]A[i]A[i]件物品,那么最多塞的容积是f[i−1][j]f[i-1][j]f[i−1][j];
2、放第iii件物品,那么最多塞的容积是f[i−1][j−A[i]]+A[i]f[i-1][j-A[i]]+A[i]f[i−1][j−A[i]]+A[i]。
所以只需要比较这两者谁大即可,即f[i][j]=max{f[i−1][j],f[i−1][j−A[i]]+A[i]}f[i][j]=\max\{f[i-1][j],f[i-1][j-A[i]]+A[i]\}f[i][j]=max{f[i−1][j],f[i−1][j−A[i]]+A[i]}最后返回f[lA−1][s]f[l_A-1][s]f[lA−1][s]代码如下:
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) {// write your code hereif (A == null || A.length == 0) {return 0;}// dp[i][j]表示从A[0, ..., i]中拿若干物品塞进容积为j的背包,最多能塞多少体积int[][] dp = new int[A.length][m + 1];// 初始化第0行for (int j = A[0]; j <= m; j++) {dp[0][j] = A[0];}for (int i = 1; i < A.length; i++) {for (int j = 0; j <= m; j++) {dp[i][j] = dp[i - 1][j];if (j >= A[i]) {dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - A[i]] + A[i]);}}}return dp[A.length - 1][m];}
}
时空复杂度O(lAs)O(l_As)O(lAs)。
接下来考虑空间优化。注意到每次计算f[i][j]f[i][j]f[i][j]的时候,只用到了上一行正上方的元素,和上一行的左边的元素。所以考虑以行滚动更新。注意在更新列的时候,需要从右向左更新。
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) {// write your code hereif (A == null || A.length == 0) {return 0;}int[] dp = new int[m + 1];for (int j = A[0]; j <= m; j++) {dp[j] = A[0];}for (int i = 1; i < A.length; i++) {for (int j = m; j >= A[i]; j--) {dp[j] = Math.max(dp[j], dp[j - A[i]] + A[i]);}}return dp[m];}
}
时间复杂度不变,空间变为O(s)O(s)O(s)。
【Lintcode】92. Backpack相关推荐
- 【Lintcode】125. Backpack II
题目地址: http://www.lintcode.com/problem/backpack-ii/description 0−10-10−1背包问题,AAA表示物品体积,VVV表示物品价值,背包容量 ...
- 【Lintcode】562. Backpack IV
题目地址: https://www.lintcode.com/problem/backpack-iv/description 给定一个数组AAA,代表每个物品的体积,题目保证AAA里的数全是正数并且没 ...
- 【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 给定一 ...
最新文章
- 小蓝发布带屏幕的单车,瞄准精准广告媒体平台
- 计算当前时间对应的本周一、上周一
- MongoDB之Hadoop驱动介绍
- 浅谈各种数据库连接池
- How is target My note application rendered - renderManager
- 最长回文子串_【每日编程142期】最长回文子串II
- 微信小程序 - 授权页面
- asp activex 读取服务器上的文件,webshell中上传asp文件调用服务器ActiveX控件溢出获取shell...
- perf-perf stat用户层代码分析
- plist java_帮助plist文件
- android 字体淡入淡出,如何让文字在Android中淡入淡出?
- MySQL索引. ref_mysql中索引利用情况(explain用法)
- 真会玩!竟然可以这样用IDEA通过数据库生成lombok版的POJO...
- IS-IS hello 包结构及邻接关系的建立
- Linux下命令积累
- Activemq配置文件详解
- 最小的操作系统MenuetOS
- 逆势而上,Intel大连工厂高价挖人
- imx6ull用video4linux,CB140(imx6ull)使用Openwrt系统
- 【已解决】terminate called after throwing an instance of ‘cv::Exception‘,已放弃 (核心已转储)
热门文章
- 2021年全球最具吸引力的雇主:谷歌、微软、苹果占据前三名
- android 存储盘 dcim,什么是DCIM?手机照片的存储路径
- R plotly包函数的使用 plot_ly(),add_trace(),layout()
- 一枚程序媛的java人生—2018年年终总结
- matlab2012卸载,matlab2012一些函数删除后的替代解决方法及用到操作
- 2017年衢州联赛 T2
- Kubernetes 1.5通过Ceph实现有状态容器
- 魅族手机怎么开启smart lock功能
- 大连海事大学信息与通信工程系808考研上岸经验分享
- MATLAB下载处理.nii文件资源包(NIfTI_20140122zip)