请用c++写出以下题目代码及其注释给定 N 种硬币,其中第种硬币的面值为 Ai,共有 C。个。 从中选出若干个硬币,把面值相加,若结果为 S,则称“面值 S 能被拼成” 求1~M 之间能被拼成的面值有多少个。
时间: 2023-05-22 14:01:23 浏览: 161
钱币组合方法数的问题(C++实现)
5星 · 资源好评率100%
以下是代码及注释:
#include <stdio.h>
#define MAX_N 100
#define MAX_M 10000
int n, m, c;
int a[MAX_N];
int dp[MAX_M];
int main() {
// 读入数据
scanf("%d%d%d", &n, &m, &c);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 初始化 dp 数组
dp[0] = 1;
// 动态规划
for (int i = 0; i < n; i++) {
for (int j = m; j >= a[i]; j--) {
dp[j] += dp[j - a[i]];
}
}
// 统计答案
int ans = 0;
for (int i = 1; i <= m; i++) {
if (dp[i] <= c) {
ans++;
}
}
// 输出答案
printf("%d\n", ans);
return 0;
}
注释中解释了每一行代码的作用,这段代码实现了一个动态规划算法,用于求解给定硬币面值的情况下,1~M 之间能被拼成的面值有多少个。
阅读全文