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