algorithm - 诊断动态规划与优先级队列的情况

标签 algorithm recursion dynamic-programming priority-queue

我正在尝试确定是否可以使用 DP 或优先队列解决以下问题:

1) 我有一组对象。我的目标是在满足约束的同时选择足够多的分数给我最高分。

2) 每个对象的特征。每个对象都有一个分数和一个与之相关的深度。

3)约束:最终对象集合的深度总和必须<=100

例如

Index/Score/Depth (numbers below follow accordingly)

1 70 10

2 60 30

3 40 50

4 40 25

5 30 35

这些可能的输出可以是

Sum of Score/Sum of Depth (numbers below follow accordingly)

170 90 (i.e. Objects 1,2,3)

200 100 (i.e. Objects 1,2,4,5) -- the winner

130 90 (i.e. Objects 2,4,5)

150 85 (i.e. Objects 1,3,4)

140 95 (i.e. Objects 1,3,5)

以上表明贪婪的方法是行不通的,即总是取最高分或最低成本。例如,选择对象 4,5(总分 70,总深度 60)比只选择对象 3(得分 40 成本 50)要好。因此,直接的方法是行不通的,我需要探索我的整个搜索空间。所以似乎优先队列不起作用,是吗? DP呢?有没有办法在这里应用动态规划?

最佳答案

所述问题是经典背包问题的重新表述,众所周知,该问题可通过动态规划求解。参见 this维基百科文章了解更多详情。使用优先级队列的方法很可能会导致贪心算法,可以对其进行细化以产生 2 近似值。更准确地说,元素可以按效率排序,贪婪地取走,直到下一个元素不再适合为止。然后从这个解决方案中获取更好的和最有利可图的项目。

关于algorithm - 诊断动态规划与优先级队列的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25843275/

相关文章:

arrays - 在两个排序数组中查找缺失的数字

shell - 递归列出所有目录和文件

java - 给定一批 0-9 的整数,在我用完某个整数之前我能写的最后一个数字是多少?

java - 用递归计算特殊字符

algorithm - 广义的两蛋拼图

c - 如何使用 C 将动态字符串放入数组中

algorithm - 解释0-扩展算法

algorithm - 在排序和旋转列表中插入一个元素

c++ - 确定数组是否可以排序旋转 3 个连续的数组元素?

algorithm - 递归树和渐近复杂性 : T(n) = T(n/3) + T(n/2) + n