C语言编程支付方法:取1元、2元和5元纸币共10张,凑整18元,共有几种方法?(用n表示)
时间: 2024-02-13 08:05:40 浏览: 115
这是一个经典的硬币找零问题,可以使用动态规划算法来解决。具体步骤如下:
1. 定义状态:使用i张纸币凑j元钱的方法数,用dp[i][j]表示。
2. 初始化状态:当使用0张纸币凑0元钱时,方法数为1,其余状态初始化为0。
3. 状态转移:对于第i张纸币,有两种选择,一种是不使用该纸币,此时方法数为dp[i-1][j];另一种是使用该纸币,此时方法数为dp[i][j-coin[i]],其中coin[i]表示第i种纸币的面值。因此状态转移方程为:dp[i][j] = dp[i-1][j] + dp[i][j-coin[i]]。
4. 最终结果:当使用10张纸币凑整18元时,方法数为dp[10][18]。
根据上述思路,可以编写如下的C语言代码来求解:
```
#include <stdio.h>
int main()
{
int coin[3] = {1, 2, 5}; // 纸币面值
int dp[11][19] = {0}; // 动态规划数组
int i, j;
// 初始化状态
for(i = 0; i <= 10; i++)
dp[i][0] = 1;
// 状态转移
for(i = 1; i <= 10; i++)
{
for(j = 1; j <= 18; j++)
{
if(j < coin[i%3])
dp[i][j] = dp[i-1][j];
else
dp[i][j] = dp[i-1][j] + dp[i][j-coin[i%3]];
}
}
// 输出结果
printf("共有%d种方法\n", dp[10][18]);
return 0;
}
```
运行结果为:共有63种方法。
阅读全文