以下是使用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均为正整数。您可以根据实际情况进行调整。
C语言实现硬币组合计数算法:求n个硬币面值为m的组合方式

原文地址: https://www.cveoy.top/t/topic/caYG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录