这里主要实现路径记录,只求最值问题移步
以下均打印输出路径,即装入背包的物品序号,和最大值。
01背包问题
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int total_weight = 10;
int w[6] = { 0,5,4,3,2,1 };
int v[6] = { 0,1,2,3,4,5 };
int dp[11] = { 0 };
int path[6][11] = { 0 };
for (int i = 1; i <= 5; i++)
for (int j = 10; j >= w[i]; j--)
if (dp[j] < dp[j - w[i]] + v[i])
{
dp[j] = dp[j - w[i]] + v[i];
path[i][j] = 1;
}
int i = 5, j = 10;
while (i > 0 && j > 0)
{
if (path[i][j] == 1)
{
cout << i << ' ';
j -= w[i];
}
i--;
}
cout << endl;
cout << "总的价值为: " << dp[10] << endl;
return 0;
}
完全背包问题
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int total_weight = 10;
int w[6] = { 0,5,4,3,2,1 };
int v[6] = { 0,1,2,3,4,5 };
int dp[11] = { 0 };
int path[6][11] = { 0 };
for (int i = 1; i <= 5; i++)
for (int j = w[i]; j <= 10; j++)
if (dp[j] < dp[j - w[i]] + v[i])
{
dp[j] = dp[j - w[i]] + v[i];
path[i][j]=1;
}
int i = 5, j = 10;
while (i > 0 && j > 0)
{
if (path[i][j] == 1)
{
cout << i << ' ';
j -= w[i];
}
else
i--;
}
cout << endl;
cout << "总的价值为: " << dp[10] << endl;
return 0;
}
多重背包问题
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int total_weight = 10;
int w[6] = { 0,5,4,3,2,1 };
int v[6] = { 0,1,2,3,4,5 };
int cot[6] = { 0,1,2,1,2,1 };
int dp[11] = { 0 };
int path[6][11] = { 0 };
for (int i = 1; i <= 5; i++)
for (int k = 1; k <= cot[i]; k++)
for (int j = 10; j >= w[i]; j--)
if (dp[j] < dp[j - w[i]] + v[i])
{
dp[j] = dp[j - w[i]] + v[i];
path[i][j] = 1;
}
int i = 5, j = 10;
while (i > 0 && j > 0)
{
if (path[i][j] == 1&&cot[i])
{
cout << i << ' ';
j -= w[i];
cot[i]--;
}
else
i--;
}
cout << endl;
cout << "总的价值为: " << dp[10] << endl;
return 0;
}