01 背包问题 动态规划
2018-03-22 23:22
330 查看
/*! * @file 0-1背包问题.cpp * @Date: 2018/03/21 20:46 * @author: sicaolong * @Contact: sicaolong@163.com * @brief: * @TODO: */ #include<iostream> #include <vector> #include<assert.h> using namespace std; int pack_01(const vector<int>&w, const vector<int>&v, int C); int bestValue(const vector<int>&w, const vector<int>&v, int index,int c); int pack_01_DP(const vector<int>&w, const vector<int>&v, int C); int pack_01_DP_01(const vector<int>&w, const vector<int>&v, int C); vector<vector<int>>memo; int max(int a, int b) { return a > b ? a : b; } //=========main函数 int main() { int max1 = max(2, 4); cout << max1 << endl; vector<int>w = { 1, 2, 3 }; vector<int>v = { 6, 10, 12 }; int best_value1=pack_01_DP(w, v, 5); int best_value2 = pack_01_DP_01(w, v, 5); cout<<best_value1<<endl; cout << best_value2 << endl; } int pack_01(const vector<int>&w, const vector<int>&v, int C) { int n = w.size(); memo=vector<vector<int>>(n, vector<int>(C + 1, -1)); return bestValue(w, v, n - 1, C); } //用[0....index]的物品,填充容积为c的背包的最大价值; int bestValue(const vector<int>&w, const vector<int>&v, int index, int c) { if (index < 0 || c <= 0) return 0; if (memo[index][c] != -1) return memo[index][c]; int result = bestValue(w, v, index - 1, c); if (c >= w[index]) result = max(result, v[index] + bestValue(w, v, index - 1, c - w[index])); memo[index][c] = result; return result; } int pack_01_DP(const vector<int>&w, const vector<int>&v, int C)//使用的o(C)的空间复杂度;将行数n 改为2 { assert(w.size() == v.size());//无效的输入; int n = w.size();//物品的数量;行数 if (n == 0) return 0; vector<vector<int>>memo2(2, vector<int>(C + 1, -1)); for (int j = 0; j <= C;j++)//遍历列,看看第0个物品能不能放入; { memo2[0][j] = (j > w[0] ? v[0] : 0); } for (int i = 1; i < n;i++)//行循环 { for (int j = 1; j <= C;j++)//列循环 { if (j<w[i]) memo2[i%2][j] = memo2[(i-1)%2][j];//如果不放入第i个元素的话,容量c不变 else memo2[i%2][j] = max(memo2[(i-1)%2][j], v[i] + memo2[(i-1)%2][j - w[i]]);//放入第i个元素 } } return memo2[(n - 1)%2][C];//返回最大值; } int pack_01_DP_01(const vector<int>&w, const vector<int>&v, int C)//使用的o(C)的空间复杂度;将行数n 改为一行 { assert(w.size() == v.size());//无效的输入; int n = w.size();//物品的数量;行数 if (n == 0) return 0; vector<int>memo_01(C + 1, -1); for (int j = 0; j <= C; j++)//遍历列,看看第0个物品能不能放入; memo_01[j] = (j > w[0] ? v[0] : 0); for (int i = 1; i < n; i++)//行循环 for (int j = C; j >=w[i]; j--)//列循环 memo_01[j] = max(memo_01[j], v[i] + memo_01[j - w[i]]);//放入第i个元素 return memo_01[C];//返回最大值; }
相关文章推荐
- 01背包问题(动态规划)
- 夕拾算法进阶篇:17)01背包和完全背包问题 (动态规划DP)
- 01背包问题 动态规划
- c语言数据结构:01背包问题-------动态规划
- 动态规划三部曲之01背包问题的分析和实现(二)
- 动态规划:01背包问题的浅谈
- 01背包问题--动态规划
- 01背包问题python(使用递归和动态规划)
- 夕拾算法进阶篇:18)装箱问题 (01背包_动态规划DP)
- 01背包问题 动态规划解法
- 01背包问题---动态规划详解
- 集合问题 动态规划 01背包
- 实际问题的算法抽象——动态规划中的01背包问题
- 01背包问题-动态规划
- 动态规划——背包问题1:01背包
- 动态规划 4、基础背包问题总结(从01开始)
- (1)01背包问题____动态规划
- 01背包问题 动态规划 c语言实现
- 01背包问题回溯法和动态规划
- 01背包问题【动态规划】