在英格兰,货币由英镑,英镑和便士,p组成,一般流通中有八个硬币:
1p,2p,5p,10p,20p,50p,£1(100p)和£2(200p)。可以通过以下方式赚取2英镑:
1x£1 + 1x50p + 2x20p + 1x5p + 1x2p + 3x1p
使用任意数量的硬币可以使用多少种不同的方式?
我看到了使用动态编程的项目Euler#31的许多解决方案,但只有少数人使用暴力。
我正试图用旧的学校蛮力来解决硬币和问题。但我有点失落。
我在C ++中有这段代码
#include <iostream>
using namespace std;
void PrintCombo(int num, int* arr, int index )
{
if (num == 0)
{
for (int i = 0; i<index; i++)
{
if (i != 0)
cout << ',';
cout << arr[i];
}
cout << '\n';
return;
}
for (int i = num; i > 0; i--)
{
if (index == 0 || i <= arr[index - 1])
arr[index] = i;
else
continue;
PrintCombo(num - i, arr, index + 1);
}
}
int main()
{
int num = 200;
int *arr = new int[num];
PrintCombo(num, arr, 0);
}
每次只减1。是否有可能使它减少1,2,5,10,20,50,100,200的值,或者我必须为每个硬币写相同的代码?我正在尝试打印每个给出200的组合,最后有多少组合给出200个整体。
答案 0 :(得分:4)
(张贴作为答案而不是评论)
您可能需要一组硬币值,然后在再次输入该函数之前迭代它。所以你会改变这样的功能:
for (int i = 0; i < 8; i++) // 8 coin values
{
if (coins[i] > num)
continue;
if (index != 0 && coins[i] > arr[index - 1])
continue;
arr[index] = coins[i];
PrintCombo(num - coins[i], arr, index + 1);
}
并在某处定义coins
数组:
int coins[] = {1, 2, 5, 10, 20, 50, 100, 200};
编辑:完整代码计数而不是列出组合:
#include <iostream>
using namespace std;
int coins[] = {1, 2, 5, 10, 20, 50, 100, 200};
int PrintCombo(int num, int* arr, int index){
if (num == 0)
return 1;
int combinations = 0;
for (int i = 0; i < 8; i++){ // 8 coin values
if (coins[i] > num)
continue;
if (index != 0 && coins[i] > arr[index - 1])
continue;
arr[index] = coins[i];
combinations += PrintCombo(num - coins[i], arr, index + 1);
}
return combinations;
}
int main(){
int num = 200;
int *arr = new int[num];
cout << PrintCombo(num, arr, 0);
cout << '\n';
}