c语言某个国家仅有1分、2分和5分硬币,将钱(n≥5)兑换成硬币有很多种兑法。编写一个实验程序计算出10分钱有多少种兑法,并列出每种兑换方式。
时间: 2024-11-03 18:23:32 浏览: 80
编写程序,输出用一元人民币兑换成1分、2分和5分硬币共有多少种兑换方法。
在C语言中,可以使用动态规划的方法来解决这个问题。我们可以创建一个二维数组dp[n+1][4],其中dp[i][j]表示有i分钱的情况下,可以使用j个5分硬币的情况数。因为题目只涉及1分和2分硬币,所以数组大小设置为4,代表0个5分硬币。
以下是简单的算法步骤:
1. 初始化dp数组,对于每个状态dp[0][j]=1,表示0分钱有0种兑换方式(包括0个硬币);
2. 从i=1到n遍历每一分钱的情况,依次更新dp[i][j]:
- 对于5分硬币:dp[i][j] += dp[i - 5][j - 1];如果剩余的钱可以构成,则增加上一个状态的结果;
- 对于2分硬币:dp[i][j] += dp[i - 2][j];如果剩余的钱也可以构成,则加上不使用5分硬币时的结果;
- 对于1分硬币:dp[i][j] += dp[i - 1][j];每次增加1分硬币都不影响结果,因为无论是否使用5分硬币,结果都是相同的。
3. 最终dp[n][0]就是10分钱的不同兑换方式数,同时可以根据这个数组记录下每种兑换方式的信息。
下面是一个简单的C语言函数示例,由于代码量较大,这里仅给出核心部分:
```c
#include <stdio.h>
int coinChange(int n, int coins[]){ // coins[]存储1, 2, 5分硬币值
int dp[n + 1][4], ways = 0;
for (int i = 0; i <= n; ++i){
dp[i][0] = i == 0 ? 1 : 0; // 初始化dp表
}
// 动态规划求解
for (int i = 1; i <= n; ++i){
for (int j = 1; j <= 3 && i >= coins[j]; ++j){
dp[i][j] = dp[i][j - 1] + dp[i - coins[j]][j];
}
if(dp[i][3] > 0) ways++; // 如果可以组成,则计数
}
return ways;
}
int main(){
int coins[] = {1, 2, 5};
int n = 10;
int ways = coinChange(n, coins);
printf("10分钱有 %d 种兑换方式。\n", ways);
// 可以进一步完善程序,记录并打印所有兑换方式
// 这部分需要额外的数据结构和循环来实现,略去细节...
return 0;
}
```
阅读全文