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