20.4.16 360机试题*2(2)

给定一个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;
}

不说什么了,现在回头看看都很简单,但是要在机试短时间写出来还是有点难度的。。(反正我看我凉了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值