蓝桥杯 概率计算 C++算法提高 HERODING的蓝桥杯之路

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  生成n个∈[a,b]的随机整数,输出它们的和为x的概率。
输入格式
  一行输入四个整数依次为n,a,b,x,用空格分隔。
输出格式
  输出一行包含一个小数位和为x的概率,小数点后保留四位小数
样例输入
2 1 3 4
样例输出
0.3333
数据规模和约定
  对于50%的数据,n≤5.
  对于100%的数据,n≤100,b≤100.

解题思路:
老实说我一直害怕解决动态规划问题,所以一直磨磨蹭蹭不敢上手,今天趁着周末的空闲时光钻研了一下这道题目,虽然是个很简单的动态规划题目,但是的确是让我受益匪浅,感慨颇多,这里的dp[x][y]有着特殊的意思,x是随机的数为x的情况,y表示总和为y,那么dp[x][y]就是是随机的数为x、y总和的概率,那么从1开始,概率一开始都一样,因为是1,然后从数的个数为2开始,y必须是要是大于抽到的 新的数,所以还需要一个for循环来判断,代码的注释很详尽,代码如下:

#include<bits/stdc++.h>

using namespace std;

double dp[110][10000];	//dp[i][j]表示i个数的和为j的时候的概率

int main(){
	int n, a, b, x;
	cin >> n >> a >> b >> x;
//	初始化为0 
	memset(dp, 0, sizeof(dp));
//	初始化第一组dp,其实是每个区间里面整数的概率 
	for(int i = a; i <= b; i ++){
		dp[1][i] = 1.0 / (b - a + 1);
	} 
	
//	 n个数 
		for(int i = 2; i <= n; i ++)
		{
			//第i个数为j的时候
			for(int j = a; j <= b; j ++)
			{
				//和为k的时候	
				for(int k = 1; k <= x; k ++)
				{
					//表示可以获得k值的情况 
					if (k - j > 0)
						dp[i][k] += dp[i - 1][k - j] * 1.0 / (b - a + 1);
				}
			} 
		}
	cout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(4);//限制输出位数 	
	cout << dp[n][x];
	return 0;
} 

感谢这位老哥思路的提供:https://blog.csdn.net/weixin_38391092/article/details/78308235

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/107753093
今日推荐