HDU 1203(01背包)

来源:互联网 发布:战锤狂鲨淘宝上一百多 编辑:程序博客网 时间:2024/05/01 17:02

题意:n万美元,m个学校,然后是m个学校的学费 及其成功拿到offer的概率。求至少拿到一个学校offer 的概率。


分析:要求至少拿到一个offer的概率,即等于1-(一个offer也拿不到的概率)。1-(1-dp[k])*(1-p[k])
状态转移方程:dp[j]=max(dp[j],1-(1-dp[j-a[i]])*(1-p[i]));
dp[j]为花费为j万元时,至少拿到一个offer的概率。


#include<cstdio>#include<vector>#include<cstring>#include<algorithm>using namespace std;int main(){    int n,m;    while(scanf("%d%d",&n,&m),n+m)    {        vector <int> a(m+1);//若开m空间的,会Re,因为下面的循环是从1开始        vector<float> b(m+1),dp(n+10);        for(int i=1;i<=m;i++)            scanf("%d %f",&a[i],&b[i]),b[i]=1.0-b[i];        fill(dp.begin(),dp.end(),0);//初始化dp数组,        for(int i=1;i<=m;i++)            for(int j=n;j>=a[i];j--)              dp[j]=max(dp[j],1-(1-dp[j-a[i]])*b[i]);        printf("%.1f%%\n",dp[n]*100);    }    return 0;}
0 0
原创粉丝点击