Robberies 01背包变形 hdoj

Posted 青春的梦想付诸行动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Robberies 01背包变形 hdoj相关的知识,希望对你有一定的参考价值。

在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能讲物品i装入多次,也不能只装入物品的一部分。因此,该问题被称为0-1背包问题。 

 

将小偷计划要偷的钱的总数作为背包的容量,然后每个银行的存款就作为各个物品的重量,
每个银行小偷的逃跑率就作为每个物品的价值,这样就转化为01背包问题了。
至于为什么不可以用题目给的被抓获的概率作为价值,是因为小偷被抓与否的计算方法,
不是将每个银行小偷被抓的概率相乘,概率论的基本知识,所以要以逃跑率作为价值。
定义数组 F[j]为偷到j万元的时候,逃跑的概率,那么状态方程如下:
F[j]=max{F[j],F[j-m[i]]*g[i]},其中m[i]是第i个银行的存款,g[i]是在该银行偷窃后逃跑的概率
这个状态方法和O1背包的状态方程是一个思想的。

 

#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
     int t,n,mj[103],i,j,sum;  //mj表示价钱
     double p,rj[103],temp,dp[10010];//rj表示不被抓的概率  dp表示金钱为i时不被抓的概率
     
     scanf("%d",&t);
     
          while(t--)
          {
               sum=0;
               memset(dp,0,sizeof(dp));
               dp[0]=1;  //没偷钱表示100%不被抓
               scanf("%lf%d",&p,&n);
               for(i=0;i<n;i++)
               {
                    scanf("%d%lf",&mj[i],&temp);
                    rj[i]=1-temp;
                    sum+=mj[i];
               }
               
               for(i=0;i<n;i++)
                    for(j=sum;j>=mj[i];j--) 
                    if(dp[j-mj[i]]*rj[i]>dp[j])
                         dp[j]=dp[j-mj[i]]*rj[i];
               p=1-p;
               for(i=sum;i>=0;i--)
                    if(dp[i]>=p)
                    break;
               printf("%d\n",i);
          }
     
     return 0;
}

 

以上是关于Robberies 01背包变形 hdoj的主要内容,如果未能解决你的问题,请参考以下文章

Robberies (01背包dp变形)

HDU——2955 Robberies (0-1背包)

Robberies(01背包)

hdu2955 Robberies (01背包)

hdu 2895 01背包 Robberies

hdu 2955 Robberies (01背包好题)