某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。
例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5:3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 int main() 8 { 9 int i,j,k;10 //二进制枚举,需要概率对半11 double cnt = 0;12 for(i=0; i<16; i++)13 {14 double a = 1000, b = 2000;//写在for内, 15 for(j=0; j<4; j++)//从0开始 16 {17 if((i>>j)&1)18 {19 a -= a/4;20 b += a/4;21 }22 else23 {24 a += b/4;25 b -= b/4;26 }27 }28 if(fabs(a-b)<1000.0)//内层for外 29 cnt++;//double 也可以自增 30 } 31 cout<
1 #include2 #include 3 #define N 4 4 double p=0.5;//p表示甲赢的概率是0.5 5 6 double fun(double x, double y, int cur, double k) { 7 double sum=0; 8 if(cur==N) { 9 if(fabs(x-y)<1000)10 sum+=k;11 return sum;12 }13 sum+=fun(x-x/4,y+x/4,cur+1,k*(1-p));//甲输掉比赛14 sum+=fun(x+y/4,y-y/4,cur+1,k*p);15 return sum;//这个必须有,因为当cur!=N时必须也要有返回 16 }17 int main() {18 printf("%lf\n",fun(1000,2000,0,1));19 return 0;20 }