了解项目Euler#31

时间:2009-04-26 10:33:48

标签: algorithm

有人可以解释我problem 31 of project euler吗?我不明白这个问题。

问题在于以任何顺序计算硬币,如:

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

9 个答案:

答案 0 :(得分:23)

我也很难理解这个问题,而不习惯英国货币。

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

您会被问到有多少种不同的方法可以将这些值组合起来以产生200便士。

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

  • 1,1,1,1,1
  • 1,1,1,2
  • 1,2,2
  • 5
祝你好运!

答案 1 :(得分:2)

你必须将这个问题分解为你可以用相同或更低价值的硬币制作每个硬币值的方法。这将导致你这样的事情(我希望我的假设是正确的):

  • <强> 1P

    A_1p = {{1p}}
    |A_1p| = 1
    
  • <强> 2P

    A_2p = {{2p}, {1p,1p}}
    |A_2p| = 1 + 1 = 2
    
  • <强> 5P

    A_5p = {{5p}, {2p,2p,1p}, {2p,1p,1p,1p}, {1p,1p,1p,1p,1p}}
    |A_5p| = 1 + 3 = 4
    
  • <强> 10便士

    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
    
  • ...

答案 2 :(得分:1)

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

以下是一些(微不足道的)可能的组合:

  • 1 x 2£
  • 2 x 1£
  • 200 x 1p
  • 1 x 1£+ 100 x 1p
  • ...

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

答案 3 :(得分:1)

您可以使用递归来考虑所有少于2英镑的金额。 (然后将差异添加为便士)

答案 4 :(得分:1)

我认为问题陈述很明确。它将硬币列为:

1p,2p,5p,10p,20p,50p,£1(100p)和£2(200p)

因此,从便士的角度来看,很明显一磅的价值。我认为问题更多的是关于问题的最终目标。它问

“使用任意数量的硬币,可以用多少种不同的方式赚钱?”

这里的困惑似乎与秩序有关。解决了这个问题之后,我将说明顺序在解决方案中并不重要。重要的是构成总计200p所需的每种面额的硬币数量。

我将添加一个建议,这是一个小问题,非常简单的递归可解决。如果你不确定如何继续下去,那么一个值得关注的地方就是数字partitions的理论。

答案 5 :(得分:1)

此问题是一个众所周知的问题的特例,称为子集和(http://en.wikipedia.org/wiki/Subset_Sum

答案 6 :(得分:1)

这是一个我根本不懂的棘手解决方案。解决方案是 http://blog.csdn.net/No_End_Point/archive/2009/06/26/4301149.aspx

这是一个很好的理论:Integer Partition in Wikipedia

从这里开始:http://tardate.blogspot.com/2008/10/rolling-project-euler-on-ruby.html

答案 7 :(得分:1)

嘿,简单的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]

答案 8 :(得分:0)

效率低于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