题意 : 中文题不详述。
思路 :类似于01背包的DP,就是放与不放的问题,不过这个要求概率,至少得到一份offer的反面就是一份也得不到,所以先求一份也得不到的概率,用1减掉就可以得到所求。
//HDU 1203
#include <stdio.h>
#include <iostream>
using namespace std ;
struct node
{
int a ;
double b ;
}p[] ;
double dp[] ;
int main()
{
int n,m ;
while(~scanf("%d %d",&n,&m))
{
if(n == && m == ) break ;
for(int i = ; i < m ; i++)
scanf("%d %lf",&p[i].a,&p[i].b) ;
for(int i = ; i <= n ; i++)
dp[i] = ;
for(int i = ; i < m ; i++)
{
for(int j = n ; j >= p[i].a ; j--)
dp[j] = min(dp[j-p[i].a]*(-p[i].b),dp[j]) ;
}
printf("%.1lf%%\n",(-dp[n])*) ;
}
return ;
}