组合概率
组合概率
题目描述 某生产零件的工厂为方便管理场内生产的零件种类,现将他们生产的零件从低等到高等零件排序,序号分别为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);
}
}

浙公网安备 33010602011771号