您的位置:首页 > 其它

动态规划 计算二项式系数

2016-12-21 20:56 155 查看
动态规划计算二项式系数,主要用到了一个性质C(m,n)=C(m,n-1)+C(m-1,n-1);

这个式子将C(m
, n)的计算问题表述为了(问题描述)C(m-1
, n -1)和C(m -1,n)两个较小的交叠子问题。

初始条件:C(m , m) = C(n , 0) = 1


得到c(n,k):




代码1(c(n,k):k为固定值):

[java]
view plain
copy

import java.util.Scanner;  
  
/** 
 *  
 * @author fool song 计算二项式 某一特定的值(记录表横向填) 
 *  
 */  
public class BinoCoeff3 {  
    public static void main(String[] args) {  
        // C(n,m)  
        System.out.println("求C(n,m)");  
        System.out.println("输入n:");  
        Scanner input = new Scanner(System.in);  
        int n = Integer.valueOf(input.nextInt());  
        System.out.println("输入m:");  
        int m = Integer.valueOf(input.nextInt());  
        getBinoCoeff(n,m);  
    }  
  
    public static void getBinoCoeff(int n,int m) {  
        int[][] arr = new int[n + 1][n + 1];  
        boolean yn=true;  
        for (int i = 0; i <= n; i++) {  
            for (int j = 0; j < i + 1; j++) {  
                if (i == j || j == 0) {  
                    arr[i][j] = 1;  
                } else {  
                    arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];  
                }  
                if(i==n&&j==m){  
                    yn=false;  
                    break;  
                }  
            }  
            if(yn==false){  
                break;  
            }  
        }  
        Sy
4000
stem.out.println("c("+n+","+m+")="+arr
[m]);  
    }  
  
}  

代码2(求c(n,k):k=0……n):

[java]
view plain
copy

import java.util.Scanner;  
  
/** 
 *  
 * @author fool song 计算二项式系数 求出所有项 
 */  
public class BinoCoeff2 {  
    public static void main(String[] args) {  
        // C(n,m)  
        System.out.println("输入n:");  
        Scanner input = new Scanner(System.in);  
        int n = Integer.valueOf(input.nextInt());  
        getBinoCoeff(n);  
    }  
  
    public static void getBinoCoeff(int n) {  
        int[][] arr = new int[n + 1][n + 1];  
        for (int i = 0; i <= n; i++) {  
            for (int j = 0; j < i + 1; j++) {  
                if (i == j || j == 0) {  
                    arr[i][j] = 1;  
                } else {  
                    arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];  
                }  
            }  
        }  
        printf(arr, n);  
    }  
  
    public static void printf(int[][] arr, int n) {  
        for (int i = 0; i < n + 1; i++) {  
            System.out.println("c("+n+","+i+")="+arr
[i]);  
        }  
    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法