牛客链接:https://www.nowcoder.com/questionTerminal/185dc37412de446bbfff6bd21e4356ec
题目:有一些面值的人民币比如1,2,5,10,20。用这几种人民币组成一个整数N,求出有几种方案。
比如N = 5, 则有1+1+1+1+1, 2+1+1+1, 2+2+1, 5共四种方案,输出4
类似于完全背包,每张币都可以取无数次。f[i]表示N=i时的方案数
代码:
class Exchange {
public:
int countWays(vector<int> changes, int n, int x) {
// write code here
int* f = new int[x+1];
for(int i = 0; i < x+1; i++) f[i] = 0;
f[0] = 1;
for(int i = 0; i < n; i++)
for (int j = changes[i]; j <= x; j++)
f[j] = f[j] + f[j -changes[i]];
return f[x];
}
};
第一个for循环遍历所有的人民币面值
假如当遍历到面值为5的人民币时,
j = 6的时 可以从j = 1(j - 5)转移过来,所以j = 5的方案数应该包括j = 1的方案数(f[1])。
当j = 7时,f[7] 应该包括f[2]的方案数。
所以转移方程为 f[j] += f[j - changes[i]]