Algorithm 从背包中检索物品[一维数组实现]

Algorithm 从背包中检索物品[一维数组实现],algorithm,Algorithm,这个算法运行良好 我们如何检索流程中选择的项目 这是上一篇文章中的算法 for (int j = 0; j < N; j++) { if (C-w[j] < 0) continue; for (int i = C-w[j]; i >= 0; --i) { //loop backwards to prevent double counting dp[i + w[j]] = max(dp[i + w[j]], dp[i] + v[j]); //loo

这个算法运行良好

我们如何检索流程中选择的项目

这是上一篇文章中的算法

for (int j = 0; j < N; j++) {
    if (C-w[j] < 0) continue;
    for (int i = C-w[j]; i >= 0; --i) { //loop backwards to prevent double counting
        dp[i + w[j]] = max(dp[i + w[j]], dp[i] + v[j]); //looping fwd is for the unbounded problem
    }
}
printf( "max value without double counting (loop backwards) %d\n", dp[C]);
背包阵列如下所示:

0 0 3 3 5 6 8 9 9 11 
通过选择第1项和第2项,得出最佳值=11

如何检索所选项目?或者如何知道我们选择了哪些项目? [项目1和项目2]

添加另一个示例:

weight: 16 19 23 28
value: 2 3 4 5
C = 7
迭代1

0 16 16 16 16 16 16
迭代2

0 16 19 19 35 35 35
迭代3

0 16 19 23 35 39 42
迭代4

0 16 19 28 35 39 44

第1项和第4项的最佳值为44,只需通过检查刚找到的解决方案是否比以前看到的任何解决方案都好来替换max call。如果是,请将其储存起来,以备日后参考

他们做了些什么?还有,你想问什么?除了DP数组外,保留一个数组,每个值告诉你需要选择的最佳
j
。你能解释更多吗?能提供一个例子吗?
0 16 19 28 35 39 44