用c++完成以下问题:蒜头君最近在设计一款找钱系统,但它设计的系统比较奇葩。假如有 n 种硬币,每种硬币面值用 a 表示,并且数量不限。该系统会根据你要找的金额 m,从而找到最少使用硬币的数量以及该数量下的方案总数。
时间: 2023-05-11 11:05:01 浏览: 239
这个问题可以使用动态规划来解决。首先定义一个数组 dp,其中 dp[i] 表示找到金额 i 所需的最少硬币数量。初始化 dp[0] 为 0,其余元素为正无穷大。然后遍历硬币面值数组 a,对于每个面值 j,更新 dp[i] = min(dp[i], dp[i-j]+1)。最后 dp[m] 就是找到金额 m 所需的最少硬币数量。方案总数可以通过类似的动态规划思路求解,定义一个数组 count,其中 count[i] 表示找到金额 i 所需的最少硬币数量下的方案总数。初始化 count[0] 为 1,其余元素为 0。然后遍历硬币面值数组 a,对于每个面值 j,更新 count[i] += count[i-j]。最后 count[m] 就是找到金额 m 所需的最少硬币数量下的方案总数。以下是 C 代码实现:
```c
#include <stdio.h>
#include <limits.h>
#define MAX_N 100
#define MAX_M 10000
int n, m;
int a[MAX_N];
int dp[MAX_M+1];
int count[MAX_M+1];
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= m; i++) {
dp[i] = INT_MAX;
count[i] = 0;
}
dp[0] = 0;
count[0] = 1;
for (int i = 0; i < n; i++) {
for (int j = a[i]; j <= m; j++) {
if (dp[j-a[i]] != INT_MAX && dp[j-a[i]]+1 < dp[j]) {
dp[j] = dp[j-a[i]]+1;
count[j] = count[j-a[i]];
} else if (dp[j-a[i]] != INT_MAX && dp[j-a[i]]+1 == dp[j]) {
count[j] += count[j-a[i]];
}
}
}
printf("%d %d\n", dp[m], count[m]);
return 0;
}
```
阅读全文