状态 fi,s,k 表示:
边界条件时 i=n+1,此时第 1 至 i−1=n 项挑战均已挑战完成。
此时若 s≥L(至少挑战成功 L 次) 且 k≥0(背包足够装所有的地图残片),则获胜的概率为 1;否则,获胜的概率为 0。
非边界情况下:
fi,s,k 有 pi 的概率转移到 fi+1,s+1,k+ai,有 1−pi 的概率转移到 fi+1,s,k,所以:
fi,s,k=pi×fi+1,s+1,k+ai+(1−pi)×fi+1,s,k
但是第 2 组样例就 WA 了,不知道哪里思考错了,这是我的代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 220;
bool vis[maxn][maxn][maxn*2];
double f[maxn][maxn][maxn*2];
int n, L, K, a[maxn];
double p[maxn];
// 当前在第 i 局,目前已经赢了 s 局,剩余背包容量为 k
double dfs(int i, int s, int k) {
k = min(k, maxn*2-1);
if (i == n+1) {
return k >= 210 && s >= L ? 1 : 0;
}
if (vis[i][s][k])
return f[i][s][k];
vis[i][s][k] = true;
return f[i][s][k] = p[i] * dfs(i+1, s+1, k + a[i]) + (1 - p[i]) * dfs(i+1, s, k);
}
int main() {
cin >> n >> L >> K;
for (int i = 1; i <= n; i++) {
cin >> p[i];
p[i] /= 100.0;
}
for (int i = 1; i <= n; i++)
cin >> a[i];
double res = dfs(1, 0, 210);
printf("%.6lf\n", res);
return 0;
}
但是不知道哪里错了,有劳各位大佬帮忙看一下