#include<iostream>
#include<vector>
using namespace std;
int Knapsack(int W[], int V[], int i, int n, int j)
{
if (i == n)
return W[i] <= j ? V[i] : 0;
if (W[i] > j)
{
return Knapsack(W, V, i + 1, n, j);
}
else if (W[i] <= j)
{
int t1 = Knapsack(W, V, i + 1, n, j);
int t2 = Knapsack(W, V, i + 1, n, j - W[i]) + V[i];
return max(t1, t2);
}
}
int NiceKnapsack(vector<vector<int>>& m, int W[], int V[], int c, int n)
{
for (int i = 1; i <= c; ++i)
{
m[n][i] = W[n]<=i ? V[n] : 0;
}
for (int i = n - 1; i > 0; --i)
{
for (int j = 1; j <= c; ++j)
{
if (W[i] > j)
m[i][j] = m[i + 1][j];
else
{
m[i][j] = max(m[i + 1][j], m[i + 1][j - W[i]] + V[i]);
}
}
}
return m[1][c];
}
int NiceKnapsack2(vector<vector<int>>& m, int W[], int V[], int c, int n)
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= c; ++j)
{
if (j < W[i])
m[i][j] = m[i - 1][j];
else
{
m[i][j] = max(m[i - 1][j], m[i - 1][j - W[i]] + V[i]);
}
}
}
return m[n][c];
}
void PrintMap(vector<vector<int>>& m)
{
int n1 = m.size();
int n2 = m[0].size();
for (int i = 0; i < n1; ++i)
{
for (int j = 0; j < n2; ++j)
{
cout << m[i][j] << " ";
}
cout << endl;
}
}
int main()
{
const int n = 5;//物品数量
int W[n + 1] = { 0,2,2,6,5,4 };//单个重量
int V[n + 1] = { 0,6,3,5,4,6 };//价值
const int c = 10;//背包容量
vector<vector<int>> m(n + 1, vector<int>(c + 1, 0));
int maxv= NiceKnapsack2(m,W,V,c,n);
cout << maxv << endl;
PrintMap(m);
return 0;
}
0-1背包问题(递归与非递归)
最新推荐文章于 2024-05-26 12:36:56 发布