用C语言写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。
时间: 2023-12-08 07:03:44 浏览: 80
好的,下面是用 C 语言实现硬币找零问题的代码:
```c
#include <stdio.h>
int coinChange(int coins[], int n, int amount) {
int dp[amount + 1];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = 0; i < n; i++) {
for (int j = coins[i]; j <= amount; j++) {
dp[j] += dp[j - coins[i]];
}
}
return dp[amount];
}
int main() {
int coins[] = {1, 2, 5};
int n = sizeof(coins) / sizeof(coins[0]);
int amount = 11;
int res = coinChange(coins, n, amount);
printf("%d\n", res);
return 0;
}
```
上述代码中,我们定义了一个长度为 amount+1 的数组 dp,初始化为全 0。然后,我们遍历硬币面值数组 coins,对于每个面值 ci,我们再遍历数组 dp,如果 i≥ci,那么就可以使用面值为 ci 的硬币来构成面值 i,此时方案数为 dp[i-ci],因此我们可以得到状态转移方程:
dp[i] = dp[i] + dp[i-ci]
最终的答案即为 dp[amount]。
值得注意的是,这个算法的时间复杂度为 O(nm),其中 n 是硬币面值的个数,m 是要构造的面值。在实际应用中,当 m 很大时,这个算法可能会超时。
阅读全文