#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
int number = 4;
int capacity = 8;
vector<int> w = { 0,2,3,4,5 };
vector<int> v = { 0,3,4,5,6 };
vector<vector<int>> dp(number + 1, vector<int>(capacity + 1, 0));//初始化动态规划表
vector<int>res(number + 1, 0);
void dpTable(vector<int>w,vector<int>v,int number,int capacity) {
//输入权重表,和价值表,货物数量以及背包大小
//构造动态规划表
for (int i = 1; i <= number; i++) {
for (int j = 1; j <= capacity; j++) {
if (w[i] > j) dp[i][j] = dp[i - 1][j];
else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
}
}
//回溯法求最优解
void findMax(int i, int j) {
if (i > 0) {
if (dp[i - 1][j] == dp[i][j]) {
res[i] = 0;
findMax(i - 1, j);
}
else if ((j - w[i] >= 0) && (dp[i][j] == dp[i - 1][j - w[i]] + v[i])) {
res[i] = 1;
findMax(i - 1, j - w[i]);
}
}
}
int main() {
dpTable(w, v, number, capacity);
//输出动态规划表
for (int i = 0; i <= number; i++) {
for (int j = 0; j <= capacity; j++) {
cout << dp[i][j] << " ";
}
cout << endl;
}
findMax(number, capacity);
//输出最优解
for (int i = 0; i < res.size(); i++) cout << res[i] << " ";
return 0;
}
参考链接:https://yngzmiao.blog.csdn.net/article/details/81667885?spm=1001.2014.3001.5506