c语言解决第一行一个整数n( n ≤ 10000 ),表示需找零的金额。 第二行一个整数m( m ≤ 100 ),表示硬币面值的个数。 第三行为m个整数,表示m个硬币的面值d1<d2<…<dm,其中d1=1。
时间: 2024-02-01 17:13:57 浏览: 141
好的,这个问题可以使用动态规划来解决。我们可以定义一个数组dp,其中dp[i]表示找零i元所需要的最少硬币数。则有以下状态转移方程:
dp[i] = min(dp[i], dp[i - coins[j]] + 1),其中coins[j]表示第j个硬币的面值。
首先将dp数组初始化为无穷大,然后将dp[0]赋值为0。接着,我们遍历硬币面值数组,对于每个硬币面值,再从1到n遍历一遍,更新dp数组。最终,dp[n]即为所需的最少硬币数。
以下是示例代码:
```c
#include <stdio.h>
#include <limits.h>
#define MAXN 10010
#define MAXM 110
int dp[MAXN]; // dp数组
int coins[MAXM]; // 硬币面值数组
int main()
{
int n, m;
scanf("%d%d", &n, &m);
// 初始化dp数组
for (int i = 1; i <= n; i++) {
dp[i] = INT_MAX;
}
dp[0] = 0;
// 读入硬币面值数组
for (int i = 1; i <= m; i++) {
scanf("%d", &coins[i]);
}
// 动态规划
for (int i = 1; i <= m; i++) {
for (int j = coins[i]; j <= n; j++) {
dp[j] = dp[j] < dp[j - coins[i]] + 1 ? dp[j] : dp[j - coins[i]] + 1;
}
}
// 输出结果
printf("%d\n", dp[n]);
return 0;
}
```
阅读全文