给定一个n,一个a0
在[0,a0]闭区间随机选一个k0,令a1=a0-k0。
然后在[0,a1]闭区间随机选一个k1,令a2=a1-k1。
。。。。
问an=0的概率是多少。
题目绕来绕去写了一大段,愣是看了半天才发现我应该把k都无视掉,这样就变成了:
给定一个n,一个a0
在[0,a0]闭区间随机选一个a1
然后在[0,a1]闭区间随机选一个a2
。。。。
问an=0的概率是多少。
一下子就清爽了。。。。。
然后分析一下就是个递归
令f(n,a)表示为所求,那么(n,a)后会等概率的产生
(n-1,a),(n-1,a-1),(n-1,a-2),,,(n-1,1),(n-1,0)
这些可能分支
即f(n,a)=(f(n-1,a)+…f(n-1,0))/(a+1)
然后f(X,0)=1,f(0,X)=0
#include "stdafx.h"
double foo(int n,int a)
{
if(a==0)
return 1.0;
if(n==0)
return 0.0;
float sum=0.0;
for(int i=0;i<=a;i++)
sum+=foo(n-1,i);
return sum/(a+1);
}
int main(int argc, char* argv[])
{
int m=3,n=3;
double pro;
pro=foo(3,3);
printf("%f",pro);
}
考虑到递归重复计算太多,可以用个数组保存中间结果
首先我们可以得到f(0,0)=1,f(0,1~a)=0
然后计算f(1,0~a)
f(2,0~a)
…
f(n,0~a)
int main(int argc, char* argv[])
{
int n=3,a=3;
double pro[4][4];
pro[0][0]=1;
for(int k=1;k<=n;k++)
pro[0][k]=0;
for(int i=1;i<=n;i++)
{
printf("%d",n);
double sum=0.0;
for(int j=0;j<=a;j++)
{
sum+=pro[i-1][j];
pro[i][j]=sum/(j+1);
//printf("pro[%d][%d]=%f\n",i,j,pro[i][j]);
}
printf("\n");
}
printf("%f",pro[3][3]);
return 0;
}
不说什么了,现在回头看看都很简单,但是要在机试短时间写出来还是有点难度的。。(反正我看我凉了)