44.0000%
题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1860
题目分析:0/1背包问题+概率的问题,对概率预处理,得到不能通过的概率,因为通过的情况比较多不好算,然后就是裸的0/1背包了。
dp[j]表示背包容量为j时的最小失败率,因为背包不要求被装满所以初始化全为1
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int const MAX = 10005; int w[MAX]; double r[MAX], dp[MAX]; int main() { int c, n; scanf("%d %d", &c, &n); for(int i = 0; i < n; i++) { scanf("%d %lf", &w[i], &r[i]); r[i] = 1.0 - r[i]; } for(int i = 0; i <= c; i++) dp[i] = 1.0; for(int i = 0; i < n; i++) for(int j = c; j >= w[i]; j--) dp[j] = min(dp[j], dp[j - w[i]] * r[i]); double ans = (1.0 - dp[c]) * 100.0; printf("%.4f%%\n", ans); }
原文地址:http://blog.csdn.net/tc_to_top/article/details/45062345