背包问题 HDOJ2955

对我这种小菜来说,不得不说这道题隐藏着一个坑,。我还义无反顾地跳进去了。。

很明显的背包问题,但是如果把银行的存款当做价值,把总的被抓概率当做容量的话,那么,。数据的精度是一大问题:注意题上并没有说精度是小数点后两位!。次之:题目的意思不是概率相加,。不是概率相加。。。

 

正确的做法是把被抓的概率换成逃跑概率,把逃跑概率做为价值,。这样,一个double [10002]的数组就可以解决问题(100*100,最多拿到10000大洋),再令 mj[100]存放银行的钱数,pj[100] 存逃跑概率

 

//状态转移方程:
for(i=0;i<n;i++)
    for ( j=sum;j>=mj[i] ;   j-- )                           ////======
    {
        if(dp[j-mj[i]]*pj[i]>dp[j])          //
 
            dp[j]=dp[j-mj[i]]*pj[i];            //倒推。
          
          
          
 
    }


 

若求拿到10000 块大洋的最大逃跑概率,可转化为拿到10000-mj[0]块大洋大最大逃跑概率,再转化为拿到10000-mj[0]-mj[1]块大洋的最大逃跑概率.............................直到 拿到mj[n]块大洋的最大逃跑概率(不一定是pj[n]  !正因为这样,才会有j--。。来逐个判断,找出最大概率)

原文地址:https://www.cnblogs.com/frankM/p/4399565.html