lintcode backpack 背包问题
2016-07-25 15:48
337 查看
问题描述
lintcode笔记
通常这种动态规划的问题需要建一个表作为缓存,然后搞清楚每个元素的含义,以及元素之间的递推关系。在这里建立一个二维表buff,行号i代表第几件物品,列号j代表背包容量。以物品
w=[2,3,5,7]和容量
m=11为例。
buff[i][j]的含义是考虑第i件物品,容量为j的时候,所能放下的最大容量。那么,递推关系应该是:
buff[i][j] = max(buff[i-1][j], buff[[i-1][j-w[i]]+w[i])
可以认为buff[i-1][j]是考虑完了第i-1件物品,现在要考虑第i件物品了。可能的操作是,放入第i件物品,或者不放。
1. 不放。那就是buff[i-1][j]。
2. 放。给当前情况腾出w[i]这么大的空间,看一下buff[i-1][j-w[i]]最大能装到多少,再把当前物品装进去。
最后的结果就取两者的较大值。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
1 | 0 | 0 | 2 | 3 | 3 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
2 | … |
代码
class Solution { public: /** * @param m: An integer m denotes the size of a backpack * @param A: Given n items with size A[i] * @return: The maximum size */ int backPack(int m, vector<int> A) { // write your code here const int nItem = A.size(); int buff[m+1]; for (int i = 0; i <= m; i++) buff[i] = 0; for (int j = 0; j < nItem; j++) { for (int i = m; i >= A[j]; i--) { buff[i] = max(buff[i], buff[i-A[j]]+A[j]); } } return buff[m]; } };
背包问题2
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 buff[m+1]; for (int i = 0; i <= m; i++) buff[i] = 0; const int nItem = A.size(); for (int j = 0; j < nItem; j++) { for (int i = m; i >= A[j]; i--) { buff[i] = max(buff[i], buff[i-A[j]]+V[j]); } } return buff[m]; } };
相关文章推荐
- C#使用回溯法解决背包问题实例分析
- 关于背包问题的一些理解和应用
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#用递归算法解决经典背包问题
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- 动态规划解决背包问题的核心思路
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 01背包问题
- 91. Decode Ways 动态规划-极客学院
- 动态规划系列【2】最长递增子序列LIS
- 动态规划系列【1】小青蛙跳台阶