码迷,mamicode.com
首页 > 其他好文 > 详细

Robberies 01背包变形 hdoj

时间:2016-05-30 21:36:00      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

在选择物品的时候,对每种物品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

标签:

原文地址:http://www.cnblogs.com/WDKER/p/5543804.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!