刚看到题,思路不是很清晰,不过考虑了一会就想到了0-1背包问题了。
拿到的OFFER 1 - m 份。
在资金允许的范围内求至少拿到一份OFFER的概率,也就是求拿不到OFFER的概率f[j].
f[j] = min ( f[ j - a[i] ] * ( 1 - b[i] ], f[j] ).
ans = 1 - f[j];
#include <stdio.h>
const int MAXN = 10005;
struct Good {
int cost;
double p;
}good[MAXN];
double min ( double a, double b ) {
return a < b ? a : b;
}
int main ( ) {
int m, n;
double f[MAXN];
while ( scanf ( "%d%d", &n, &m ) != EOF ) {
if ( n == 0 && m == 0 )
break;
for ( int i = 0; i < m; ++i )
scanf ( "%d %lf", &good[i].cost, &good[i].p );
for ( int i = 0; i <= n; ++i )
f[i] = 1;
double res = 1;
for ( int i = 0; i < m; ++i )
for ( int j = n; j >= good[i].cost; --j ) {
f[j] = min ( f[j - good[i].cost] * ( 1 - good[i].p ), f[j] );
res = min ( res, f[j] );
}
printf ( "%.1lf%%\n", ( 1 - res ) * 100 );
}
}