01背包的详细思路和解法来自
【动态规划】01背包问题(通俗易懂,超基础讲解)_Yngz_Miao的博客-CSDN博客_动态规划解决01背包问题本文章只是讲他的代码进行了修改,使代码只需要修改一些关键的数值也可以运行
代码部分如下,只需要修改下方的关键数值即可运行,已有两个例子。
#include<iostream>
#include <algorithm>
using namespace std;
//int weights[6] = { 0 , 12 , 7 , 11 , 8 , 9 }; //商品的体积
//int values[6] = { 0 , 24, 13 ,23 , 15, 16 }; //商品的价值
//int bagCap = 26; //背包大小
//int dp[6][27] = { { 0 } }; //动态规划表
//int items[6]; //最优解情况的记录
//int packageNum = 5;
int bagCap = 165;
int weights[11] = { 0,23,31,29,44,53,38,63,85,89,82 };
int values[11] = { 0,92,57,49,68,60,43,67,84,87,72 };
int dp[11][167] = { {0} };
int items[11];
int packageNum = 10;
void fillDp() { //动态规划
for (int i = 1; i <= packageNum; i++) { //一个背包一个背包的循环
for (int j = 1; j <= bagCap; j++) { //每个背包都需要根据容量来填表
if (j < weights[i]) //如果容量小于则直接拿前面的表填后面的表
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i]] + values[i]); //动态规划的精髓
}
}
}
void fillItems(int i, int j) { //最优解情况,i是物体总数,j是背包容量
if (i >= 0) { //递归判断终止的条件
if (dp[i][j] == dp[i - 1][j]) { //如果容量不够,相对于就不拿取
items[i] = 0;
fillItems(i - 1, j);
}
else if ((j - weights[i] >= 0) && (dp[i][j] == dp[i - 1][j - weights[i]] + values[i])) { //容量足够并且为决策最优解
items[i] = 1;
fillItems(i - 1, j - weights[i]);
}
}
}
void printOptimal() { //输出最优解
//for (int i = 0; i < packageNum; i++) { //动态规划表输出
// for (int j = 0; j < (bagCap + 1); j++) {
// cout << dp[i][j] << ' ';
// }
// cout << endl;
//}
//cout << endl;
for (int i = 1; i < packageNum + 1; i++) //最优解输出,第一个不输出
{
if (i == packageNum)
{
cout << items[i];
}
else
{
cout << items[i] << "->";
}
}
cout << endl;
}
int main()
{
fillDp();
fillItems(packageNum, bagCap);
printOptimal();
return 0;
}