C++ 计算组合数(动态规划)

一、题目

      《C++ 计算组合数(动态规划)》

二、思路:

      《C++ 计算组合数(动态规划)》

     《C++ 计算组合数(动态规划)》

  (1)如果m=n位置及n=0位置上元素为1:

if(n == 0 || m == n)
    return 1;

(2)其它情况:

        按列计算,当列和行相同时填1;

        当列为0时,也填1;

        其它情况根据递推公式求mat[i][j] = mat[i-1][j-1] + mat[i-1][j];

// 一列一列的计算下去
for(j = 0; j <= n; j++) { // 只要计算n列就行了,不用计算后面的
    mat[j][j] = 1;
    for(i = j+1; i <= m; i++) {
        if(j == 0)
           mat[i][j] = 1;
        else
            mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
    } // 计算Cmn
}

三、实现程序:

//  计算组合数:使用动态规划算法

#include <iostream>

int mat[100][100];

int combinat(int m, int n) {
    int i, j;
    
    if(n == 0 || m == n)
        return 1;
// // 一行一行的计算下去
//    for(i = 1; i <= m; i++) { // m一般不能为0
//        for(j = 0; j <= i && j <= n; j++) { // 当i大于n的时候不用计算,即不用计算n列候的数,节省时间
//            if(j == 0 || j == i)
//                mat[i][j] = 1;
//            else
//                mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
//        }
//    }
    // 一列一列的计算下去
    for(j = 0; j <= n; j++) { // 只要计算n列就行了,不用计算后面的
        mat[j][j] = 1;
        for(i = j+1; i <= m; i++) {
            if(j == 0)
                mat[i][j] = 1;
            else
                mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
        } // 计算Cmn
    }
    return mat[m][n];
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int m, n;
    
    std::cout << "请输入组合数的m和n:";
    std::cin >> m >> n;
    std::cout << combinat(m, n) << std::endl;
    return 0;
}

测试结果:

《C++ 计算组合数(动态规划)》

    原文作者:ChanJose
    原文地址: https://blog.csdn.net/chuanzhouxiao/article/details/86661095
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞