Algorithm 了解Euler#31项目

Algorithm 了解Euler#31项目,algorithm,Algorithm,谁能给我解释一下吗?我不太明白这个问题 问题是要以任何顺序计算硬币,如: 2*1或者可能1×1+1×50p+2×20p+1×5p+1×2p+3×1p?我对这个问题也有理解上的困难,因为我没有使用英国货币 一磅有100便士。以下硬币(便士)可用:1、2、5、10、20、50、100和200 你会被问到有多少种不同的方式可以将这些值组合在一起创造出200便士 例如,形成5便士有4种方法: 1,1,1,1,1,1 1,1,1,2 1,2,2 五, 祝你好运 问题基本上是当你有8种不同类型的硬币可用

谁能给我解释一下吗?我不太明白这个问题

问题是要以任何顺序计算硬币,如:


2*1或者可能1×1+1×50p+2×20p+1×5p+1×2p+3×1p

我对这个问题也有理解上的困难,因为我没有使用英国货币

一磅有100便士。以下硬币(便士)可用:1、2、5、10、20、50、100和200

你会被问到有多少种不同的方式可以将这些值组合在一起创造出200便士

例如,形成5便士有4种方法:

  • 1,1,1,1,1,1
  • 1,1,1,2
  • 1,2,2
  • 五,

祝你好运

问题基本上是当你有8种不同类型的硬币可用时,有多少种可能的组合可以得到2英镑的货币(=200p)

以下是几个(微不足道的)可能的组合:

  • 一乘二
  • 2×1
  • 200 x 1便士
  • 1 x 1英镑+100 x 1便士

问题是:有多少这样的组合是可能的?

< P>你可以使用递归来考虑所有少于2英镑的金额。(然后把差额加上便士)

我认为问题陈述很清楚。它将这些硬币列为:

1便士、2便士、5便士、10便士、20便士、50便士、1英镑(100便士)和2英镑(200便士)

因此,以便士来衡量一英镑的价值是显而易见的。我认为问题更多的是关于问题的最终目标。它要求

“使用任意数量的硬币可以用多少种不同的方式制造2英镑?”

这里的混乱似乎与秩序有关。在解决了这个问题之后,我将说明顺序在解决方案中并不重要。重要的是每种面额的硬币数量需要达到200便士


我要补充一点,这是一个小问题,可以用简单的递归来解决。如果您不确定如何继续,可以从数字的理论中寻找答案。

您必须将这个问题分解为使用相同或更低值的硬币使每个硬币具有价值的方法。这会让你得出这样的结论(我希望我的假设是正确的):

  • 1p

    A_1p = {{1p}}
    |A_1p| = 1
    
    A_2p = {{2p}, {1p,1p}}
    |A_2p| = 1 + 1 = 2
    
    A_5p = {{5p}, {2p,2p,1p}, {2p,1p,1p,1p}, {1p,1p,1p,1p,1p}}
    |A_5p| = 1 + 3 = 4
    
    A_10p = {{10p},
             {5p,5p}, {5p,2p,2p,1p}, {5p,2p,1p,1p,1p}, {5p,1p,1p,1p,1p,1p},
             {2p,2p,1p,2p,2p,1p}, {2p,2p,1p,2p,1p,1p,1p,}, {2p,2p,1p,1p,1p,1p,1p,1p,},
             {2p,1p,1p,1p,2p,1p,1p,1p,}, {2p,1p,1p,1p,1p,1p,1p,1p,1p},
             {1p,1p,1p,1p,1p,1p,1p,1p,1p,1p},
             {2p,2p,2p,2p,2p,2p}
            }
    |A_10p| = 1 + 10 + 1 = 12
    
  • 2p

    A_1p = {{1p}}
    |A_1p| = 1
    
    A_2p = {{2p}, {1p,1p}}
    |A_2p| = 1 + 1 = 2
    
    A_5p = {{5p}, {2p,2p,1p}, {2p,1p,1p,1p}, {1p,1p,1p,1p,1p}}
    |A_5p| = 1 + 3 = 4
    
    A_10p = {{10p},
             {5p,5p}, {5p,2p,2p,1p}, {5p,2p,1p,1p,1p}, {5p,1p,1p,1p,1p,1p},
             {2p,2p,1p,2p,2p,1p}, {2p,2p,1p,2p,1p,1p,1p,}, {2p,2p,1p,1p,1p,1p,1p,1p,},
             {2p,1p,1p,1p,2p,1p,1p,1p,}, {2p,1p,1p,1p,1p,1p,1p,1p,1p},
             {1p,1p,1p,1p,1p,1p,1p,1p,1p,1p},
             {2p,2p,2p,2p,2p,2p}
            }
    |A_10p| = 1 + 10 + 1 = 12
    
  • 5p

    A_1p = {{1p}}
    |A_1p| = 1
    
    A_2p = {{2p}, {1p,1p}}
    |A_2p| = 1 + 1 = 2
    
    A_5p = {{5p}, {2p,2p,1p}, {2p,1p,1p,1p}, {1p,1p,1p,1p,1p}}
    |A_5p| = 1 + 3 = 4
    
    A_10p = {{10p},
             {5p,5p}, {5p,2p,2p,1p}, {5p,2p,1p,1p,1p}, {5p,1p,1p,1p,1p,1p},
             {2p,2p,1p,2p,2p,1p}, {2p,2p,1p,2p,1p,1p,1p,}, {2p,2p,1p,1p,1p,1p,1p,1p,},
             {2p,1p,1p,1p,2p,1p,1p,1p,}, {2p,1p,1p,1p,1p,1p,1p,1p,1p},
             {1p,1p,1p,1p,1p,1p,1p,1p,1p,1p},
             {2p,2p,2p,2p,2p,2p}
            }
    |A_10p| = 1 + 10 + 1 = 12
    
  • 10p

    A_1p = {{1p}}
    |A_1p| = 1
    
    A_2p = {{2p}, {1p,1p}}
    |A_2p| = 1 + 1 = 2
    
    A_5p = {{5p}, {2p,2p,1p}, {2p,1p,1p,1p}, {1p,1p,1p,1p,1p}}
    |A_5p| = 1 + 3 = 4
    
    A_10p = {{10p},
             {5p,5p}, {5p,2p,2p,1p}, {5p,2p,1p,1p,1p}, {5p,1p,1p,1p,1p,1p},
             {2p,2p,1p,2p,2p,1p}, {2p,2p,1p,2p,1p,1p,1p,}, {2p,2p,1p,1p,1p,1p,1p,1p,},
             {2p,1p,1p,1p,2p,1p,1p,1p,}, {2p,1p,1p,1p,1p,1p,1p,1p,1p},
             {1p,1p,1p,1p,1p,1p,1p,1p,1p,1p},
             {2p,2p,2p,2p,2p,2p}
            }
    |A_10p| = 1 + 10 + 1 = 12
    

这个问题是一个非常有名的问题的特例,叫做子集和()

这是一个棘手的解决方案,我一点也不理解。一个解决方案就在眼前

这里有一个很好的理论:


从这里开始:

嘿,简单dp,使用python:

ways = [0]*201
ways[0] = 1
for x in [1,2,5,10,20,50,100,200]:
    for i in xrange(x, 201):
        ways[i] += ways[i-x]
print ways[200]

效率低于DP,但针对此特定问题,运行速度为每秒1/2。简单递归:

solve    []     s         = 0

solve    (c:ct) 0         = 1

solve    (c:ct) s | c > s = solve ct s

solve cs@(c:ct) s         = (solve cs (s - c)) + (solve ct s)

answer = solve [200,100,50,20,10,5,2,1] 200

你想把你不明白的事情说清楚吗。(如果你在整个问题中用“100P”和“2英镑”替换“1英镑”,可能会稍微清楚一些。请不要再添加java标签。问题不是java相关。HMM 0.5对于递归解决方案来说太慢了。我的小优化蛮力是在2.1MS(单线程、C++、Win32、CPU 3.2GHz)中完成的。为什么有这么大的差异?或者你只是没有准确地测量时间?我的意见是递归应该快得多,确切地说是
dp
?dp=动态规划{2p,2p,1p,1p,1p,1p,}2p,1p,1p,1p,2p,1p,1p,1p,}是一样的。你是怎么得到12个组合的?我只得到11个。感谢你的澄清,我不确定1,1,1,2是否会被认为与1,2,1,1不同