hdu1203 I NEED A OFFER!
http://acm.hdu.edu.cn/showproblem.php?pid=1203
DP,0-1背包
和0-1背包稍有差别:
状态转移方程:dp[j] = max(dp[j], dp[j-w[i]]*v[i])
P(至少一份offer) = 1 - P(一个offer也没有)
P(一个offer也没有) = Mul(1 - P(拿到 i 学校的offer)) (其中i为选择的学校)
#include <stdio.h> #define N 10010 int n, m; float dp[N], v[N]; int w[N]; int main() { int i, j; while(scanf("%d%d", &m, &n), m||n) { for(i=1; i<=n; i++) { scanf("%d %f", w+i, v+i); v[i] = 1 - v[i]; } for(i=0; i<=m; i++) { dp[i] = 1.0; } for(i=1; i<=n; i++) { for(j=m; j>=w[i]; j--) { if(dp[j-w[i]]*v[i] < dp[j]) { dp[j] = dp[j-w[i]]*v[i]; } } } printf("%.1f%%\n", (1-dp[m])*100); } return 0; }