【问题标题】:Minimum coin change or 0-1 knapsack最少零钱或 0-1 个背包
【发布时间】:2019-07-25 21:28:54
【问题描述】:

我有这样的数据集:

长度:233、333、450、560、650、780 上限:5400

现在我的问题是从长度设置的最高到最低选择项目以弥补限制或尽可能接近。

我知道背包和零钱都可以解决我的问题。我想知道哪个更可取。

注意硬币找零使用贪心算法,背包使用动态规划

【问题讨论】:

  • 如果有两种算法是合适的,那么总有一种是你设法在更短的时间内实现的更好的一种。如果您花费太多精力来决定您正在浪费宝贵的公司时间。如果这对您没有帮助,则意味着您有一个要优化的实际属性,可能是速度,可能是代码大小,可能是 RAM 需求。解释您的优化目标会很有帮助。否则这个问题太宽泛,无法回答。
  • 一个真正有趣的优化目标是给老师或面试官留下深刻印象。在这种情况下,请看这里:stackoverflow.com/questions/57016753/…
  • 我的目标是优化计算时间和实施。我想用贪婪的方法使用硬币找零,因为它很容易实现。但是对于任何数据集,我是否会获得构成每次限制的优化长度集?
  • 所以你真的怀疑这两种算法是否合适?我认为你应该edit你的问题更清楚地表达。

标签: java dynamic-programming knapsack-problem coin-change


【解决方案1】:

根据我对您的问题的理解,您似乎在争论您的问题是否可以用贪婪算法解决,或者它是否更像 0-1 背包问题,而贪婪算法不会给您最佳的每次都解决。

这里有一些关于贪心算法和 0-1 背包问题的背景信息:

为了扩展贪心算法,它们的工作基础是有一些普遍最优的属性可以从中选择下一个项目,并在本地工作。换句话说,一个算法要贪心,它必须具有贪心选择属性和最优子结构,这意味着贪心算法做出的第一个选择可以在最优解,并且最优解包含其中较小子问题的最优解。

另一方面,0-1 背包问题不是一个可以贪婪解决的问题。这在贪婪选择属性显示的事实中最为明显。没有一个单一的属性可以根据关闭来选择您的第一个和下一个项目;如果您选择最大的物品,可能是它恰好占用了太多空间,并且没有较小的物品可以填满那个空间,而选择较小的物品会完全填满背包。如果您先选择较小的物品,可能会导致您的背包现在的空间太小而无法装满较大的物品,而较早选择其中一件较大的物品会完成背包。

0-1 背包是一个需要动态规划解决方案的问题,它在非本地运行,通俗地说,是一种优化的“蛮力”形式。换句话说,它可以被认为是对递归的优化。


您的问题是选择离散项目来完成或接近最大长度限制。

在我看来,这几乎与 0-1 背包问题一模一样,如果您想要任何数据集的最优解,则无法用贪心算法解决。

相反,我们想使用动态规划,如果问题同时具有最优子结构重叠子问题,您可以看出可以通过这种方式解决问题。 p>

0-1 背包问题显示最优子结构,原因如下: 从 n 项和 W 重量的数据集中可以获得的最大值是:n - 1 项和 W 重量的最大值,或者,n - 1 项和 W - 项目 n 的重量的最大值,加上 n 的值。 每个子问题的最优解都可以组合起来,为更大的问题创建最优解。

0-1 背包问题也有重叠子问题,原因是: 该问题的递归解决方案包括尝试 n 项的所有组合并检查这些项的权重是否小于 W,然后找到这些值的最大值。这本身就涉及大量重复性工作,因此尝试的每个项目组合都可以计算出与之前在较少项目上计算的相同的总数,因此,使用简单的组合,您可以看到时间复杂度变成了阶乘。

这就是为什么 0-1 背包问题和您的问题最好使用动态规划来解决,因此您可以保存先前子问题的答案并参考您已经计算的总和来解决依赖于重叠子问题的后续问题'答案。

-

谢谢你,祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2011-12-28
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多