我使用以下函数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;
}