项目欧拉#31蛮力

时间:2016-02-21 13:14:40

标签: c++ c brute-force

在英格兰,货币由英镑,英镑和便士,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个整体。

1 个答案:

答案 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';
}