• 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
    ",i);
              }
         
         return 0;
    }
  • 相关阅读:
    深入了解接口
    深入.NET平台C#编程 测试题分析
    如何设计高级的数据库
    数据库查询的基础技巧
    回顾Spring MVC_01_概述_入门案例
    初学My Batis之入门
    Spring MVC之视图解析器和URL-Pattern的配置方案
    SpringMVC之入门
    WebService入门
    Spring之实现任务调度
  • 原文地址:https://www.cnblogs.com/WDKER/p/5543804.html
Copyright © 2020-2023  润新知