欧拉项目31

Project Euler #31

本文关键字:项目      更新时间:2023-10-16
问题描述:

在英国,货币由pound,£和便士,p和组成一般流通硬币有八种:

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

可以用下列方法赚2英镑:

1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p

使用任意数量的硬币,有多少种不同的方法可以制造2英镑?

我试图想出我自己的算法,但失败了。所以,我想到了这个(公认的答案)。我尝试在c++中复制它。当我在main()函数的combos()中输入1、2和5时,它会给出正确的答案,但是10返回11,而它应该是12。我的算法有什么问题?

#include <iostream>
#include <cstdlib>
using namespace std;
int coin[] = {1, 2, 5, 10, 20, 50, 100, 200};
/*Amounts entered must be in pence.*/
int combinations(int amount, int size) {
    int comboCount = 0;
    if(amount > 0) {
        if(size >= 0 && amount >= coin[size])
            comboCount += combinations(amount - coin[size], size);
        if(size > 0) //don't do if size is 0
            comboCount += combinations(amount, size-1);
    } else if(amount == 0)
        comboCount++;
    return comboCount;
}
int combos(int amount) {
    int i = 0;
    //get largest coin that fits
    for(i = 7; coin[i] > amount && i >= 0; i--); 
    return combinations(amount, i);
}
int main() {
    cout << "Answer: " << combos(10) << endl;
    return 0;
}

好吧,你的代码可能返回11,因为这是正确的答案?

  • http://ideone.com/uxv4J

(实际上是注释):对不起,但我只看到1、2和5中的10便士的10种组合:

10p:    0..5*2p + rest*1p     : 6 combinations
1x5p + 5p, that is
        0..2*2p + rest*1p     : 3 combinations
        1*5p                  : 1 combination