I NEED A OFFER! hdu1203 01背包,概率

来源:互联网 发布:java 多线程并发 应用 编辑:程序博客网 时间:2024/04/28 15:07

http://acm.hdu.edu.cn/showproblem.php?pid=1203

这是一个掺和着概率的01背包,对我这种智商不足的人~ 0,0

max_prob[i]表示花费i元没拿到一份简历的概率。

则至少一份的最大值就等于1减去一分也没拿到的最小值。

#include <iostream>using namespace std;#define N 10005int money[N];double max_prob[N],prob[N];double min(double a,double b){    return a<=b?a:b;}int main(){    int n,i,j,max_money;    double mini;    while (scanf("%d%d",&max_money,&n)!=EOF){        if (n==0&&max_money==0)            break;        for (i=1;i<=n;i++)            scanf("%d%lf",&money[i],&prob[i]);        for (i=0;i<=max_money;i++)            max_prob[i]=1;        mini=1;        for (i=1;i<=n;i++)            for (j=max_money;j>=money[i];j--){                max_prob[j]=min(max_prob[j],max_prob[j-money[i]]*(1-prob[i]));                mini=min(mini,max_prob[j]);  //这里还需要考虑当提供offer的大学学费为0的情况。            }        printf("%.1lf%%\n",(1-mini)*100);    }    return 0;}


原创粉丝点击