问题描述:
在英格兰,货币由英镑,英镑和便士,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
使用任意数量的硬币可以使用多少种不同的方式?
我试图为此提出我自己的算法但失败了。所以,我遇到了this one(接受的答案)。我试图在这里用C ++复制它。当我在main()函数中输入1,2和5到combos()时,它会得到正确的答案,但是当它应该是12时,10会返回11。我的算法出了什么问题?
#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;
}
答案 0 :(得分:2)
那么,您的代码可能会返回11,因为这是正确答案?
答案 1 :(得分:0)
(评论,实际上):对不起,但我看到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