概率初始化hdu 2955 (0-1背包变形)

本文探讨了一道经典的劫匪抢银行问题,该问题要求在被抓概率不超过一定阈值的情况下,计算劫匪能够抢夺的最大金额。通过对问题的深入分析,采用动态规划的方法解决了这一问题,并提供了详细的代码实现。

查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!

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

    目题粗心:劫匪抢银行,要求被抓概率小于P。共有n个银行,第i个银行钱数为m[i],被抓概率为p[i](float型);求劫匪最多能抢多少钱;

    思绪:由于值价(被抓概率)是浮点型且不能直接相加,所以不能以值价为背包。这个目题可以以取得的值价(即抢到的钱数)为背包,求抢到一定钱时逃跑的概率;虽然抢到的钱数不是连续化变的,但是通过初始化时的妙巧理处还是可以连续历遍的,体具见代码及注释;

    每日一道理
翻开早已发黄的页张,试着寻找过去所留下的点点滴滴的足迹。多年前的好友似乎现在看来已变得陌生,匆忙之间,让这维持了多年的友谊变淡,找不出什么亲切感,只是偶尔遇上,淡淡地微笑,如今也只能在这发黄的页张中找寻过去的那些让人难忘的,至少我可以握住这仅剩下一段的“丝线头”……
#include<stdio.h>
#include<string.h>
#define ans(a,b) ((a)>(b)?(a):(b))
#define N 111
int m[N];
float p[N],f[11111];
int main()
{
    int T,n,i,j,sum,ans;
    float P;
    scanf("%d",&T);
    while(T--){
        sum=0,ans=0;
        scanf("%f%d",&P,&n);
        for(i=0;i<n;i++){
            scanf("%d%f",&m[i],&p[i]);
            sum+=m[i];
        }
        memset(f,0,sizeof(f));//初始化,特别意注f[0];
        f[0]=1;
		//盘算抢j钱金时逃跑的概率
        for(i=0;i<n;i++){
            for(j=sum;j>=m[i];j--){//意注j的上限
                f[j]=ans(f[j],f[j-m[i]]*(1-p[i]));
            }
        }
        for(j=0;j<=sum;j++){//对于j取不到的值恒有f[j]=0,why?想一想初始化
            if(P>(1-f[j])&&j>ans)
                ans=j;
        }
        printf("%d\n",ans);
    }
    return 0;
}

文章结束给大家分享下程序员的一些笑话语录: 现在社会太数字化了,所以最好是有一个集很多功能于一身的设备!

转载于:https://www.cnblogs.com/jiangu66/archive/2013/05/06/3063518.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值