题意是给出买零食中奖第i个卡片的概率p[i]
求最少买多少包零食可以凑齐所有卡片
就没读懂样例是怎么来的...
据说官方解题报告写的是用如下的方法做:
后来想了下大概是这样:
0.1 0.4
10.500
要中第一个卡片需要买1/0.1==10包零食//这里剩余的9包可能含有卡片2
要中第二个卡片需要买1/0.4==2.5包零食//这里剩余的7.5包可能含有卡片1
而10+2.5包零食中除去含有另一个卡片的情况
10+2.5-1/(0.1+0.4)==10.5
代码如下:
//#include <bits/stdc++.h>
#include <vector>
#include <cstdio>
#include <iostream>
using namespace std;
int n;
double ans, tmp;
vector<double> vec;
void dfs(int i, double w, int k) {
for( ; i<n; ++i) {
tmp = w+vec[i];
ans += k/tmp;
dfs(i+1, tmp, -k);
}
}
int main(void) {
while(scanf("%d", &n) != EOF) {
ans = 0.0;
vec.clear();
for(int i=0; i<n; ++i) {
scanf("%lf", &tmp);
vec.push_back(tmp);
}
cout.setf(ios::fixed);
cout.precision(6);
dfs(0, 0.0, 1);
cout << ans << endl;
}
}