概率统计(DP)
2015-10-25 14:13
302 查看
问题叙述性说明
生成n个月∈[a,b]随机整数。并且将它们输出到x概率。
输入格式
输入线跟四个整数n。a,b,x,用空格分隔。
输出格式
输出一行包括一个小数位和为x的概率。小数点后保留四位小数
例子输入
2 1 3 4
例子输出
0.3333
数据规模和约定
对于50%的数据,n≤5.
对于100%的数据,n≤100,b≤100.
题解:
这是一道典型的全然背包,可是在做的过程中遇到了一些波折。
dp[i][j]:挑选i个数字后得到j的概率。
dp[i][j]=dp[i-1][z]*1/sum;
每一种情况都要再乘一个1/sum,而情况与情况之间是加和的关系。
(最開始想用得到X数/总数),后来发现到最后实在太大了。100^100.所以用dp直接表示概率更好一点,剩下的就是一个全然背包了。
代码实现:
生成n个月∈[a,b]随机整数。并且将它们输出到x概率。
输入格式
输入线跟四个整数n。a,b,x,用空格分隔。
输出格式
输出一行包括一个小数位和为x的概率。小数点后保留四位小数
例子输入
2 1 3 4
例子输出
0.3333
数据规模和约定
对于50%的数据,n≤5.
对于100%的数据,n≤100,b≤100.
题解:
这是一道典型的全然背包,可是在做的过程中遇到了一些波折。
dp[i][j]:挑选i个数字后得到j的概率。
dp[i][j]=dp[i-1][z]*1/sum;
每一种情况都要再乘一个1/sum,而情况与情况之间是加和的关系。
(最開始想用得到X数/总数),后来发现到最后实在太大了。100^100.所以用dp直接表示概率更好一点,剩下的就是一个全然背包了。
代码实现:
#include <bits/stdc++.h> #define MAX 110 using namespace std; double dp[MAX][MAX*MAX]; double sum; int N,a,b,X; int main() { scanf("%d%d%d%d",&N,&a,&b,&X); sum = b-a+1; memset(dp,0,sizeof(dp)); for( int i = 0; i < N; i++ ) { for( int j = a; j <= b; j++ ) { if( i == 0 ) dp[i][j]=1/sum; else { for( int z = 0; z <= X; z++ ) { if( dp[i-1][z] != 0 ) dp[i][z+j]+=(dp[i-1][z]*1/sum); } } } } printf("%.4lf\n",dp[N-1][X]); }
相关文章推荐
- 软件工程 可行性研究 习题2
- Android中使用Serializable和Parcelable实现序列化详解(含实例)
- 《程序员面试金典》--寻找二叉树中某个节点中序遍历的下一个节点
- UIView的层次调整,及子view布局模式自动布局模式(停靠模式)
- javascript,隔行变色,鼠标移入时高亮
- Android 多线程-----AsyncTask详解
- Java内部类为什么可以访问外部类的成员
- 4、在mybatis中使用db.properties
- 全球数据库-->基金/管理产品-->分类/行业平均
- Android 开发手记二 C可执行程序编译实例
- iOS 百度地图 小的特点demo
- HDU 4354 Missile(树形DP)
- PHP:小数位计算
- 课后作业1:字串加密
- 全球数据库-->基金/管理产品-->基金分析/新闻/报告
- unity, 什么时候用静态类,什么时候用单例
- 源码解析Android中View的measure量算过程
- programming-challenges Unidirectional TSP (111104) 题解
- 记录
- Java的四中引用类型