您的位置:首页 > 其它

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背包 动态规划