您的位置:首页 > 编程语言 > C语言/C++

01背包、完全背包、多重背包问题的C++实现及路径记录

2017-04-19 17:35 746 查看
这里主要实现路径记录,只求最值问题移步

01背包、完全背包、多重背包问题的C++实现

以下均打印输出路径,即装入背包的物品序号,和最大值。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言