本题题目居然写错了也没改正,囧,应该是AN OFFER!
题解就是dp加上概率论求解。
因为需要求最少有一间学校录取的概率,那么就可以使用逆向思维,求没有一间学校录取的概率。基本的概率论思维,不过如果久了没做概率论还是会有点麻烦的。
然后就是标准的01背包求解了:
#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <limits.h>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int MAX_N = 10001;
struct Offer
{
int val;
double p;
};
Offer offs[MAX_N];
double dp[MAX_N];
int N, M;
int main()
{
while (~scanf("%d %d", &N, &M) && (N || M))
{
for (int i = 0; i < M; i++)
{
scanf("%d %lf", &offs[i].val, &offs[i].p);
}
for (int i = 0; i <= N; i++)
{
dp[i] = 1.0;
}
for (int i = 0; i < M; i++)
{
for (int j = N; j >= offs[i].val; j--)
{
if (dp[j]>dp[j-offs[i].val]*(1.0-offs[i].p))
dp[j] = dp[j-offs[i].val]*(1.0-offs[i].p);
}
}
printf("%.1lf%%\n", (1.0-dp[N])*100.0);
}
return 0;
}