C++ 欧拉计划#31

C++ 欧拉计划#31,c++,coin-change,C++,Coin Change,问题描述: 在英国,货币由英镑、英镑、便士、便士和英镑组成 一般流通的硬币有八种: 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

问题描述:

在英国,货币由英镑、英镑、便士、便士和英镑组成 一般流通的硬币有八种:

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;
}
#包括
#包括
使用名称空间std;
int币[]={1,2,5,10,20,50,100,200};
/*输入的金额必须以便士为单位*/
整数组合(整数金额、整数大小){
int comboCount=0;
如果(金额>0){
如果(大小>=0和金额>=硬币[大小])
comboCount+=组合(金额-硬币[大小],大小);
if(size>0)//如果size为0,则不执行此操作
comboCount+=组合(数量,大小-1);
}否则,如果(金额==0)
comboCount++;
返回组合计数;
}
整数组合(整数金额){
int i=0;
//得到适合自己的最大硬币
对于(i=7;硬币[i]>数量&&i>=0;i--);
收益组合(金额,i);
}
int main(){
cout(实际上是评论):对不起,我只看到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

那么,您的代码可能会返回11,因为这是正确的答案


1x10p硬币计数和5x2p硬币计数的可能重复。你也可以使用一个10p硬币,总共11种方式。对,如果还有10p硬币,那么再添加一个组合。(最后一个组合实际上是2x5p)是的。这是我通过手工和程序得到的。哇……是的,显然10个硬币只有11种可能。