动态规划实例(四):二项式系数问题

来源:互联网 发布:python写入excel 编辑:程序博客网 时间:2024/05/17 01:17
    以下是常见的二项式系数的定义:
        1) 一个二项式系数 C(n, k)  可以被定义为(1 + X)^n 的展开式中  X^k  的系数。
        2) 二项式系数对组合数学很重要,因它的意义是从n件物件中,不分先后地选取k件的方法总数,因此也叫做组合数.
   问题
        写一个函数,它接受两个参数n和k,返回二项式系数C(n,k)。例如,你的函数应该返回6 当n = 4 k = 2时,返回10当 n = 5 k = 2时。
   1) 最优子结构
        C(n,k)的值可以递归地使用以下标准公式计算,这个应该是高二的数学:

           1. C(n, k) = C(n-1, k-1) + C(n-1, k)

           2. C(n, 0) = C(n, n) = 1

   2) 重叠子问题

具体实例及实现代码如下:

/** * @Title: BinomialCoeff.java * @Package dynamicprogramming * @Description: TODO * @author peidong * @date 2017-6-8 上午8:32:16  * @version V1.0 */package dynamicprogramming;/** * @ClassName: BinomialCoeff * @Description: 二项式系数 * @date 2017-6-8 上午8:32:16  * */public class BinomialCoeff {    /**     *     * @Title: binomialCieffRecursion     * @Description: 递归求解组合数     * @param n     * @param k     * @return     * @return int     * @throws     */    public static int binomialCieffRecursion(int n, int k){        //边界条件判断        if(k == 0 || n == k){            return 1;        }        //递归        return binomialCieffRecursion(n-1, k-1) + binomialCieffRecursion(n-1, k);    }    public static int binomialCoeff(int n, int k){        //创建状态转移矩阵        int[][] tc = new int[n+1][k+1];        //从上到下构建状态转移矩阵        for(int i = 0; i <= n; i++){            for(int j = 0; j <= Math.min(i, k); j++){                //边界条件判断                if(j == 0 || j == i){                    tc[i][j] = 1;                }else{                    tc[i][j] = tc[i-1][j-1] + tc[i-1][j];                }                System.out.print(tc[i][j] + " ");            }            System.out.println();        }        return tc[n][k];    }    /**     * @Title: main     * @Description: 测试用例     * @param args     * @return void     * @throws     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int n =5, k = 2;        System.out.println("利用递归求解组合个数为:" + binomialCieffRecursion(n, k));        System.out.println("利用动态规划求解组合个数为:" + binomialCoeff(n, k));    }}

原创粉丝点击