我是动态编程的新手,并尝试了我的第一个 DP 问题。问题陈述是
给定一个大小为 C 的背包和 n 个大小为 s[] 且值为 v[] 的物品,最大化可放入背包的物品的容量。一个项目可以重复任意次数。(允许重复项目)。
虽然我能够制定递归关系并创建 DP 表,并最终获得可以放入背包的最大值,但我无法设计一种方法来检索必须选择哪些值才能获得所需的总和.
这是我的解决方案:
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int s[] = { 1, 3, 4, 5, 2, 7, 8 , 10};
int v[] = { 34, 45, 23, 78, 33, 5, 7 , 1};
int n = ( (sizeof(s)) / (sizeof(s[0])) );
vector<int> backtrack;
int C = 15;
int pos;
int m[20];
m[0] = 0;
int mx = 0;
for ( int j = 1; j <= C; j++) {
mx = 0;
m[j] = m[j-1];
pos = j-1;
for ( int i = 0; i < n; i++) {
mx = m[i-s[i]] + v[i];
if ( mx > m[i] ) {
m[i] = mx;
pos = i - s[j];
}
}
backtrack.push_back(pos);
}
cout << m[C] << endl<<endl;
for ( int i = 0; i < backtrack.size(); i++) {
cout << s[backtrack[i]] <<endl;
}
return 0;
}
在我的解决方案中,我尝试将选择的最大值项的位置存储在向量中,并最终打印出来。然而,这似乎并没有给我正确的解决方案。
运行程序会产生:
79
2
3
0
5
2
7
8
10
34
45
23
78
33
5
7
从输出中可以明显看出,输出中的数字不能是所选项目的大小,因为输出中没有大小为 0 的项目。
我希望你能帮助我找到我的逻辑或实现中的错误。谢谢。