noj 1860 保研(01背包 概率dp)

C. 保研

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 171            测试通过 : 40 

题目描述

    对于一些名校而言,保研不仅可以由学校推免,也可以由学生自己向希望保研的学校提出申请,这个过程有点类似于外国学生向学校提交简历等待Offer的过程。但是,投递申请需要亲自去相应学校的研招办递交材料,这就需要一些成本(比如路费等),且每个院校都有自己的录取成功率。现在,请在总成本不超过限制的情况下,求出最大的成功率。

输入

    输入包含多行。
    第一行包含两个正整数C和N,表示成本限额和N个学校。
    接下来N行,每行包含一个正整数c和一个浮点小数w,分别表示向该学校投递材料所需要消耗的成本和成功率。

输出

    仅输出一行结果,包含一个小数点后保留4位的百分

小数(有%),表示最大成功率。

样例输入

10 3
4 0.1
4 0.2
5 0.3

样例输出

44.0000%


题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1860


解题思路:概率dp,反过来求不能录取的最小概率,就是能录取的最大概率,dp[i]表示费用为i的不能录取最小概率,状态转移方程为:dp[ j ] = min ( dp[ j ] ,dp[ j - price[ i ] ] * pro [ i ] ;


代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1000000;
double dp[maxn],pro[maxn];
int pri[maxn];

int main()
{
    int n,v,i,j;
    double x,ans;
    scanf("%d%d",&v,&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%lf",&pri[i],&x);
        pro[i]=1.0-x;
    }
    for(i=0;i<maxn;i++)
        dp[i]=1.0;
    for(i=0;i<n;i++)
        for(j=v;j>=pri[i];j--)
            dp[j]=min(dp[j],dp[j-pri[i]]*pro[i]);
    ans=100.0*(1-dp[v]);
    printf("%.4lf%%\n", ans);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值