lintcode-125-背包问题 II
125-背包问题 II
给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?
注意事项
A[i], V[i], n, m均为整数。你不能将物品进行切分。你所挑选的物品总体积需要小于等于给定的m。
样例
对于物品体积[2, 3, 5, 7]和对应的价值[1, 5, 2, 4], 假设背包大小为10的话,最大能够装入的价值为9。
挑战
O(n x m) memory is acceptable, can you do it in O(m) memory?
标签
背包问题 动态规划 LintCode 版权所有
思路
采用动态规划,首先考虑使用二维数组 dp[i][j] 表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值
动态转移方程为:
dp[i][j] = 0 (i0 || j0)
dp[i][j] = dp[i-1][j] (j < V[i])
dp[i][j] = max(dp[i-1][j-A[i-1]] + V[i-1], dp[i-1][j-1]) (j >= V[i])
过程如下

code
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A & V: Given n items with size A[i] and value V[i]
* @return: The maximum value
*/
int backPackII(int m, vector<int> A, vector<int> V) {
// write your code here
int size = A.size(), i = 0, j = 0;
if(size <= 0) {
return 0;
}
vector<vector<int> > dp(size+1, vector<int>(m+1, 0));
for(i=0; i<size+1; i++) {
for(j=0; j<m+1; j++) {
if(i==0 || j==0){
dp[i][j] = 0;
}
else {
if(j >= A[i-1]){
dp[i][j] = (dp[i-1][j-A[i-1]]+V[i-1] > dp[i-1][j])?dp[i-1][j-A[i-1]]+V[i-1]:dp[i-1][j];
}
else{
dp[i][j] = dp[i-1][j];
}
}
}
}
display(dp);
return dp[size][m];
}
};
但是可以发现,当前 dp[i][j] 的取值仅仅和其上一行(左上角)元素有关,所以可以将二维数组 dp[i][j] 优化为 dp[j]
code
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A & V: Given n items with size A[i] and value V[i]
* @return: The maximum value
*/
int backPackII(int m, vector<int> A, vector<int> V) {
// write your code here
int size = A.size(), i = 0, j = 0;
if(size <= 0) {
return 0;
}
vector<int> dp(m+1, 0);
for(i=0; i<size+1; i++) {
for(j=m; j>=0; j--) {
if(i==0 || j==0){
dp[j] = 0;
}
else {
if(j >= A[i-1]){
dp[j] = (dp[j-A[i-1]]+V[i-1] > dp[j])?dp[j-A[i-1]]+V[i-1]:dp[j];
}
else{
dp[j] = dp[j];
}
}
}
}
return dp[m];
}
};
lintcode-125-背包问题 II的更多相关文章
- lintcode:背包问题II
背包问题II 给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大? 注意事项 A[i], V[i], n, m均为整数.你不能将物品进行切分.你所挑选的 ...
- 【动态规划】简单背包问题II
问题 B: [动态规划]简单背包问题II 时间限制: 1 Sec 内存限制: 64 MB提交: 21 解决: 14[提交][状态][讨论版] 题目描述 张琪曼:“为什么背包一定要完全装满呢?尽可能 ...
- 多重背包问题II
多重背包问题II 总体积是m,每个小物品的体积是A[i] ,每个小物品的数量是B[i],每个小物品的价值是C[i] 求能够放入背包内的最大物品能够获得的最大价值 和上一个很类似 上一题体积就是价值,这 ...
- 5. 多重背包问题 II 【用二进制优化】
多重背包问题 II 描述 有 NN 种物品和一个容量是 VV 的背包. 第 ii 种物品最多有 sisi 件,每件体积是 vivi,价值是 wiwi. 求解将哪些物品装入背包,可使物品体积总和不超过背 ...
- Lintcode: Sort Colors II 解题报告
Sort Colors II 原题链接: http://lintcode.com/zh-cn/problem/sort-colors-ii/# Given an array of n objects ...
- Lintcode: Majority Number II 解题报告
Majority Number II 原题链接: http://lintcode.com/en/problem/majority-number-ii/# Given an array of integ ...
- [LintCode] Wiggle Sort II 扭动排序之二
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- [LintCode] Paint House II 粉刷房子之二
There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...
- [LintCode] House Robber II 打家劫舍之二
After robbing those houses on that street, the thief has found himself a new place for his thievery ...
- lintcode:背包问题
背包问题 在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i] 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为,可以选择的空间. 如果背包的大小 ...
随机推荐
- rest_framework --- viewsets
viewsets :from rest_framework import viewsets #导入方式 ViewSetMixin(object): 这个类,大致作用就是重写了as_view()方法,假 ...
- ansible服务的部署与使用
简介: ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序 ...
- Linux centos7 安装python3 及 GCC
1.用wget下载python源码 PYTHON下载 找适合自己的版本,我下载的是3.7.2 2.用tar命令解压下载的文件 tar -zxvf Python-3.7.2.tgz 3.进入目录解压后的 ...
- 打造自己的JavaScript武器库(转)
作者: SlaneYang https://segmentfault.com/a/1190000011966867 前言 作为战斗在业务一线的前端,要想少加班,就要想办法提高工作效率.这里提一个小点, ...
- javascript中几种this指向问题
javascript中几种this指向问题 首先必须要说的是,this 永远指向函数运行时所在的对象,而不是函数被创建时所在的对象. (1).作为函数名调用 函数作为全局对象调用,this指向 ...
- python 面向对象 (多态)
什么是多态?多态就像是人有多种心情,场景不一样心情就会不一样. class Dog: def print_self(self): print('this is dog') class Hsq(Dog) ...
- maven中settings文件的配置
鉴于上一个博客写的maven打包,读者老爷们可能找不到settings文件的配置,这里专门附上settings文件的配置: 有的settings文件只含有一些空标签,需要手动去配置. <?xml ...
- List排序方法
可用使用Collections.sort(List<T> list)和Collections.sort(List<T> list, Comparator<? super ...
- python2.7入门---循环语句(for&嵌套循环)
咱们直接先来看for循环.Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串.然后再来看一下它的语法结构: for iterating_var in sequence: ...
- Code First Migrations更新数据库结构(数据迁移) 【转】
注意:一旦正常后,每次数据库有变化,做如下两步: 1. Enable-Migrations 2.update-database 背景 code first起初当修改model后,要持久化至数据库中时, ...