硬币变化:订单重要时的解决方案数量与订单无关紧要时的解决方案数量

时间:2017-05-27 03:40:08

标签: c++ algorithm dynamic-programming coin-change

我使用以下函数count_distinct和count_perm解决了动态编程的硬币更改问题,这两个函数都给出了给定金额(参数x)和使用中的硬币(参数c)的解决方案数量。向量d用于记忆:它记录每个非负数金额的解的数量,即值{0,1,...,x}。

例如,当金额为5且使用的硬币为{2,3,4}时,count_distinct给出结果1(它将解{2,3}和{3,2}视为等于),count_perm给出结果2(它认为它们是不同的解决方案)。

我不明白为什么会这种情况发生的原因。在这两个函数中,循环变量的顺序相反,但我不明白为什么它应该重要。此外,count_distinct中的索引会注意不计算负数金额,并使用count_perm中的continue语句进行相应的检查。

#include <iostream>
#include <vector>

using namespace std;

long count_distinct(int x, vector <long> c) {

    vector <long> d(x+1);
    d[0] = 1;
    int k = c.size();

    for (int i = 0; i < k; i++) {
        for (int j = c[i]; j <= x; j++) {
            d[j] += d[j - c[i]];
        }
    }
    return d[x];   
}

long count_perm(int x, vector <long> c) {

    vector <long> d(x + 1);
    d[0] = 1;
    int k = c.size();

    for (int i = 1; i <= x; i++) {
        for (int j = 0; j < k; j++) {
            if (i - c[j] < 0) continue;
            d[i] += d[i - c[j]];
        }
    }
    return d[x];
}

int main() {
    int x = 5;
    vector <long> c;
    c.push_back(2);
    c.push_back(3);
    c.push_back(4);

    long distinct = count_distinct(x, c);
    long perms = count_perm(x, c);
    cout << distinct << endl;
    cout << perms << endl;
    return 0;
}

0 个答案:

没有答案