c 種顏色巧克力,每次隨機取一個。若與手中已有顏色相同,吃掉(配對消失)。取 n 個後剩 m 個的概率。m+n 為奇則概率 0。
dp[i][j]:取了 i 個後,手中剩 j 個不同顏色巧克力的概率。
dp[i][0] = dp[i-1][1] / c
dp[i][c] = dp[i-1][c-1] / c
dp[i][j] = dp[i-1][j-1] * (c-j+1)/c + dp[i-1][j+1] * (j+1)/c (1 ≤ j < c)
解釋:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
double dp[1010][1010];
int main() {
int c, n, m;
while (~scanf("%d", &c), c) {
scanf("%d%d", &n, &m);
if (m > c || m > n || (n+m)%2) { printf("0.000\n"); continue; }
if (n > 1000) n = 1000 + n%2; // 穩態截斷
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i <= n; ++i) {
dp[i][0] = dp[i-1][1] / c;
dp[i][c] = dp[i-1][c-1] / c;
for (int j = 1; j < c; ++j)
dp[i][j] = dp[i-1][j-1]*(c-j+1)/c + dp[i-1][j+1]*(j+1)/c;
}
printf("%.3lf\n", dp[n][m]);
}
return 0;
}