Algorithm 为什么贪心换币算法对某些硬币集不起作用?

Algorithm 为什么贪心换币算法对某些硬币集不起作用?,algorithm,greedy,coin-change,Algorithm,Greedy,Coin Change,我理解硬币兑换问题的贪婪算法(用尽可能少的硬币支付特定金额)是如何工作的——它总是选择面额最大但不超过剩余金额的硬币——并且它总是为特定的硬币组找到正确的解决方案 但对于某些硬币集,贪婪算法会失败。例如,对于集合{1,15,25}和总和30,贪婪算法首先选择25,剩下5,然后选择5个1,总共6枚硬币。但是,对于最少数量的硬币,解决方案是选择15枚硬币两次 一组硬币必须满足哪些条件才能使贪婪算法找到所有总和的最小解?一个容易记住的情况是,任何一组硬币,如果按升序排序,您有: coin[0] = 1

我理解硬币兑换问题的贪婪算法(用尽可能少的硬币支付特定金额)是如何工作的——它总是选择面额最大但不超过剩余金额的硬币——并且它总是为特定的硬币组找到正确的解决方案

但对于某些硬币集,贪婪算法会失败。例如,对于集合
{1,15,25}
和总和30,贪婪算法首先选择25,剩下5,然后选择5个1,总共6枚硬币。但是,对于最少数量的硬币,解决方案是选择15枚硬币两次


一组硬币必须满足哪些条件才能使贪婪算法找到所有总和的最小解?

一个容易记住的情况是,任何一组硬币,如果按升序排序,您有:

coin[0] = 1
coin[i+1] >= 2 * coin[i], for all i = 0 .. N-1 in coin[N]
然后,使用这种硬币的贪婪算法将起作用

根据您查询的范围,可能会有更优化的(就所需硬币数量而言)分配。举个例子,如果你考虑的是范围(6..8),你有硬币而不是硬币

在N+上完成的最有效的硬币分配是在上述规则集相等的情况下,给你硬币1,2,4,8。。。;它仅仅是任何数字的二进制表示。从某种意义上说,基之间的对话本身就是一种贪婪算法

Max Rabkin在本次讨论中提供了>=2N不等式的证明:

一个形成拟阵()的集合可以通过贪婪方法来解决换币问题。简言之,拟阵是有序对 M=(S,l)满足以下条件:

  • S是有限非空集
  • l是S的一个非空子集族,称为独立子集,如果B->l A是B的子集,然后A->l
  • 如果A->l,B->l和| A |<|B |,那么有一些元素x->B-A使得U{x}->l
  • 在我们换硬币的问题中,S是所有硬币按降序排列的一组 我们需要通过S中最小数量的硬币来达到V的值

    在我们的例子中,l是一个包含所有子集的独立集,这样每个子集都有以下内容:其中的值之和是B-A,这样U{x}->l(根据3) 所以,{25,15}应该属于l,但这是一个矛盾,因为25+15>30


    因此,S不是拟阵,因此贪心方法对它不起作用。

    如果贪心算法给出的硬币数量变化对所有数量都是最优的,那么硬币系统是标准的


    对于非标准硬币系统,存在一个数量
    c
    ,贪心算法会产生次优数量的硬币
    c
    被称为反例。如果最小的反例比最大的一枚硬币大,那么硬币系统就是紧的。

    在任何情况下,如果没有任何硬币的价值加在最低面值上,低于立即低于它的面值的两倍,贪婪算法就会起作用

    i、 e.{1,2,3}之所以有效,是因为[1,3]和[2,2]加在同一个值上
    但是{1,15,25}不起作用,因为(对于更改30)15+15>25+1这是一个重复出现的问题。给定一组硬币
    {Cn,Cn-1,…,1}
    ,例如对于
    1ck-1+Ck-2和值
    V=(Ck+Ck-1)-1
    ,将贪婪算法应用于硬币的子集
    {Ck,Ck-1,…,1}
    ,其中
    Ck,今天,我解决了与此类似的关于代码力的问题(链接将在最后提供)。
    我的结论是,要用贪婪算法解决硬币兑换问题,它应该满足以下条件:-

    1.按升序对硬币值进行排序时,大于当前元素的所有值都应可被当前元素整除

    e、 硬币={1,5,10,20,100},这将给出正确的答案,因为{5,10,20,100}都可以被1整除,{10,20,100}都可以被5整除,{20100}都可以被10整除,{100}都可以被20整除

    希望这能提供一些想法

    996 A-中彩

    我们确实需要重新表述这个问题……贪婪算法的本质是,它试图使用提供的硬币面额来获得目标值。对贪婪算法所做的任何更改都只是更改达到目标值的方式。 它不包括使用的最低硬币数量。。。。 为了更好地解决这个问题,不存在安全措施。 面额较高的硬币可能会很快产生目标价值,但这不是一个安全的举措。 示例{50,47,51,2,9}获得100 贪婪的选择将是以最高面值的硬币更快地达到100。。 51+47+2 好吧,它达到了,但50+50应该可以

    让我们用{50,47,51,9}得到100 如果它贪婪地选择了最高的硬币 51它需要从集合中取出49个。它不知道这是否可能。它试图达到100,但它不能 而改变贪婪的选择只会改变达到100的方式
    这些类型的问题创建了一组解决方案和决策树分支的形式。

    答案在很大程度上取决于算法的功能:很容易贪得无厌,你应该告诉我们算法的功能,以及它是如何实现的。。。。算法要解决的实际问题是什么?好吧,我想我问的问题不对。如果一组面额必须为真,那么算法将无法工作。从(25,15,1)中赚30美分贪婪给我们25,1,1,1,1,但15美分更好。那么25、15和1如何使贪婪不起作用呢?这是一个好问题,不知道为什么会被否决。他/她想要解释一组硬币必须满足的约束条件,以便贪婪算法(总是选择适合的最大硬币)选择最小数量的硬币来支付任何费用