C语言实现硬币组合计数算法:求n个硬币面值为m的组合方式
以下是使用C语言编写的解决方案:
#include <stdio.h>
int countCombination(int n, int m) {
int dp[m + 1];
dp[0] = 1;
for (int i = 1; i <= m; i++) {
dp[i] = 0;
}
int coins[] = {1, 2, 5};
int numCoins = sizeof(coins) / sizeof(coins[0]);
for (int i = 0; i < numCoins; i++) {
for (int j = coins[i]; j <= m; j++) {
dp[j] += dp[j - coins[i]];
}
}
return dp[m];
}
int main() {
int T;
scanf('%d', &T);
while (T--) {
int n, m;
scanf('%d %d', &n, &m);
int result = countCombination(n, m);
printf('%d
', result);
}
return 0;
}
解释:
- 首先,定义一个函数
countCombination,用于计算给定n和m的硬币组合方式的数量。函数的参数为n和m,n表示硬币的个数,m表示总面值。 - 在函数中,定义一个数组
dp,用于存储不同面值组合方式的数量。数组的下标表示面值,数组的值表示对应面值的组合方式数。 - 初始化数组
dp,将第一个元素dp[0]设置为1,其余元素设置为0。 - 定义一个数组
coins,存储硬币的面值,本题中为{1, 2, 5}。 - 使用两个嵌套的循环,遍历硬币面值和总面值的组合。
- 外层循环遍历硬币的面值,内层循环从硬币面值开始遍历到总面值,计算每种面值的组合方式数。
- 在内层循环中,使用动态规划的思想,更新数组
dp的值,通过累加之前的组合方式数得到当前的组合方式数。 - 最后,返回
dp[m]作为结果,即总面值m的组合方式数。 - 在
main函数中,首先读取输入的测试数据组数T。 - 使用一个循环,遍历每组测试数据。
- 在循环中,读取每组的硬币个数n和总面值m。
- 调用
countCombination函数计算组合方式数,并输出结果。 - 注意:在示例代码中,我们假设输入的硬币个数n和总面值m均为正整数。您可以根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/caYG 著作权归作者所有。请勿转载和采集!