组合概率

组合概率

题目描述 								某生产零件的工厂为方便管理场内生产的零件种类,现将他们生产的零件从低等到高等零件排序,序号分别为1,2..n,已知该厂的任意几个低等的零件可以组合成更高等的零件,零件的序号代表了零件的等级,比如5号零件可以由1号和4号零件组合而成,也可以有2号和3号零件组合而成。现有一个序号为 x 的零件,它是由 n 个序号在[a,b]区间内的零件组合而成,求n 个序号在[a,b]区间内的零件组合为 x 零件的概率 							
输入一行输入四个整数依次为n,a,b,x,用空格分隔。数据规模和约定  对于50%的数据,n≤5.对于100%的数据,n≤100,b≤100. 样例输入2 1 3 4
输出输出一行为组合为 x 零件的概率,小数点后保留四位小数。 样例输出0.3333
时间限制C/C++语言:1000MS其它语言:3000MS 内存限制C/C++语言:65536KB其它语言:589824KB

依然是动态规划,这是一道和换零钱的第一形态,也就是计算零钱的个数很像的题目。

package com.jiading;

import java.util.Scanner;

public class Problem26 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int a=sc.nextInt();
        int b=sc.nextInt();
        int x=sc.nextInt();
        //x+1表示要凑的和,n+1表示零件数量,dp表示组合的数量
        int[][]dp=new int[x+1][n+1];
        for(int i=a;i<=b;i++){
            dp[i][1]=1;
        }
        for(int i=1;i<=x;i++){
            for(int j=1;j<=n;j++){
                for(int k=a;k<=b;k++){
                    if(i>=k)
                    dp[i][j]+=dp[i-k][j-1];
                }
            }
        }
        double allCon=Math.pow((b-a+1),n);
        System.out.printf("%.4f",dp[x][n]/allCon);
    }
}
posted @ 2020-03-22 22:27  别再闹了  阅读(302)  评论(0)    收藏  举报