动态规划解决硬币概率问题
描述
在一个星期三的早上,某同学想用扔硬币的方式来决定是否要去上算法课。
他扔 n 次硬币,如果当中有连续 m 次以上(含 m 次)的结果都是正面,那么他就去上课,否则就接着睡觉。(假设每次扔硬币扔出的正反两面的概率都是 0.5。)
输入
输入的每行有一组数据,分别为 n 和 m (0 < n <= 2000, 0 < m <= 10)。输入以 0 0 结尾。
输出
对于每组数据,输出他去上课的概率,四舍五入保留小数点后 2 位。
看到一源代码如下:
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
double r[2001];//r[i]代表投完第i个硬币时,已有连续m个正面的概率
int n,m;
cin>>n>>m;
while(n!=0&&m!=0)
{
for(int i=0;i<m;i++)
r[i]=0;//当投币次数小于m时,自然不可能有m个正面
r[m]=pow(0.5,m);
for(int i=m+1;i<=n;i++)
r[i]=r[i-1]+(1-r[i-m-1]*pow(0.5,m+1);
//投完第i个硬币时,已有连续m个正面的情况分为两种:
//1.投第i个之前已经有连续m个正面,概率为r[i-1].
//2.投完第i个时恰好有连续m个正面,这就连续m个正面的前面一次是反面,
//这m+1次确定情况的概率是1/2的m+1次方;
//这m+1次以前没有连续m个正面的概率为1-r[i-(m+1)].
//所以投完第i个时恰好有连续m个正面的概率为(1-r[i-m-1]*pow(0.5,m+1)
cout<<fixed<<setprecision(2)<<r[n]<<endl;
cin>>n>>m;
}
return 0;
}
但是当用vc6.0编译无法通过,出现以下提示:Error spawning cl.exe
sdfwerw.exe - 1 error(s), 0 warning(s)
求高手指教,哪里出错了?