当前位置: 首页 > 知识库问答 >
问题:

基于动态规划的背包物品检索

汪博达
2023-03-14

我是动态规划新手,已经尝试了我的第一个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的项目。

我希望你能帮我找到逻辑或实现中的错误。谢谢

共有1个答案

东方高洁
2023-03-14

你在遵循贪婪的方法。这很聪明,但很有启发性。我不会给你正确的代码,因为这可能是一个家庭作业,但递归函数背包如下所示:

knapsack(C): maximum profit achivable using a knapsack of Capacity C
knapsack(C) = max { knapsack(C-w[i]) + v[i] } for all w[i] <= C
knapsack(0) = 0

代码:

dp(0) = 0;
for i = 1 to C
  dp(i) = -INF;
  for k = i-1 downto 0
     if w[k] < i then
        dp(i) = max{dp(i-w[k]) + v[k], dp(i)};
print dp(Capacity);
 类似资料:
  • 动态规划 动态规划 Dynamic Programming,核心思想就是将大问题划分成小问题进行解决,从而一步一步的获得最优解的处理算法 动态规划跟分治算法思想类似,但动态规划算法会依赖到上一次计算的结果,每次求解是建立在上一次子阶段的结果基础之上进一步处理,而分治算法分解出来问题往往是独立的 动态规划一般可以通过填表的方式进行逐步推进得到最优解 0/1背包问题 01背包问题是经典的利用动态规划算

  • 我很好奇是否有可能修改(或使用)无界背包问题的DP算法,以最小化背包中物品的总价值,同时使总重量至少有一些最小约束C。 UKP最大化版本的自下而上DP算法: 我们能做一个最小化的UKP吗?如果没有,有人能提供另一种解决方案或技术来解决这样的问题吗? 谢谢,丹

  • 几天前,我在读关于分数背包问题的贪婪算法和动态规划的书,我发现这个问题可以用贪婪方法得到最优解。谁能给出一个例子或解决方案来解决这个问题的动态规划方法? 我知道贪婪方法是解决这个问题的最好方法,但我想知道动态规划是如何解决这个问题的。

  • 计算机科学中的许多程序是为了优化一些值而编写的; 例如,找到两个点之间的最短路径,找到最适合一组点的线,或找到满足某些标准的最小对象集。计算机科学家使用许多策略来解决这些问题。本书的目标之一是向你展示几种不同的解决问题的策略。动态规划 是这些类型的优化问题的一个策略。 优化问题的典型例子包括使用最少的硬币找零。假设你是一个自动售货机制造商的程序员。你的公司希望通过给每个交易最少硬币来简化工作。假设

  • *正则匹配问题[H] 三角形问题[M] 计算二进制数中1的个数[M] *括号匹配问题[M] 最短路径和[M]

  • 本文向大家介绍PHP动态规划解决0-1背包问题实例分析,包括了PHP动态规划解决0-1背包问题实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了PHP动态规划解决0-1背包问题。分享给大家供大家参考。具体分析如下: 背包问题描述:一个承受最大重量为W的背包,现在有n个物品,每个物品重量为t, 每个物品的价值为v。 要使得这个背包重量最大(但不能超过W),同时又需要背包的价值最大。 思