主要思路:概率期望。
首先可以发现 \(n\) 的数据极小。
然后我们设 \(a\) 为为每个人买东西的情况,\(b\) 为当有 \(b\) 个人去时的情况。
大家都应该知道条件概率式子为 \(P(a|b)=\frac{P(ab)}{P(b)}\)。
然后暴力搜索 \(P(ab)\) 和 \(P(b)\)。
其实这道题有复杂度更低的 dp 做法,但这样写也对,就不增设 dp 做法了,可以去其他大佬的题解中看。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, r, qwq, k[25];
double cnt, a[25], b[25];
void dfs(int x, int sum, double f) {
if (sum > r) return;
if (x > n) {
if (sum == r) {
for (int i = 1; i <= sum; i++)b[k[i]] += f;
cnt += f;
}
return;
}
dfs(x + 1, sum, f * (1 - a[x]));
k[sum + 1] = x;
dfs(x + 1, sum + 1, f * a[x]);
}
signed main() {
while (cin>>n>>r) {
if (n==0&&r==0)break;
cnt = 0;
for (int i = 1; i <= n; i++){cin>>a[i];b[i] = 0;}
dfs(1, 0, 1);
++qwq;
cout<<"Case "<<qwq<<":\n";
for (int i = 1; i <= n; i++)printf("%.6lf\n", 1.0 * b[i] / cnt);
}
return 0;
}
标签:25,Given,概率,Probability,int,题解,sum
From: https://www.cnblogs.com/AUBSwords/p/18346588