博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2955 Robberies 动态规划01背包
阅读量:5255 次
发布时间:2019-06-14

本文共 1431 字,大约阅读时间需要 4 分钟。

题意:

  第一行第一个小数,是这个人被抓住的概率最大不能超过这个数,第二个是有N个银行。一个整数和小数分别为这个银行有多少钱和被这个银行

抓住的概率。求出这个小偷在不超过自己抓住的最大概率中抢更多的银行。

 

坑爹:

  f 数组 初始化为0 ,但是 f [0] 要为1,因为不抢任何银行的时候永远是成功的。所有银行的钱数加起来是“背包”的容量,不被抓的概率是价

值。

 

解法:

  套用01背包的状态转移方程,解出不被抓住的概率,然后用1减去它,再和被抓住的概率比较。

 

View Code
1 #include
2 using namespace std; 3 4 const int maxn = 10000 + 10; 5 int price[maxn]; 6 double chance[maxn]; 7 double f[maxn]; 8 int sum; 9 10 double max(double a,double b)11 {12 return a>b?a:b;13 }14 15 void ZeroOnePack(int cost,double weight)16 {17 int j;18 for(j=sum; j>=cost; j--)19 {20 f[j]=max(f[j],f[j-cost]*weight);21 }22 }23 24 int main()25 {26 int T;27 cin>>T;28 while(T--)29 {30 int N;31 double P;32 cin>>P>>N;33 int i;34 P=1-P;35 36 sum=0;37 for(i=1; i<=N; i++)38 {39 cin>>price[i]>>chance[i];40 chance[i]=1-chance[i]; 41 sum+=price[i];42 }43 44 memset(f,0,sizeof(f));45 f[0]=1.0;46 for(i=1; i<=N; i++)47 {48 ZeroOnePack(price[i],chance[i]);49 }50 51 52 for(i=sum; i>=0; i--)53 {54 if(f[i]>P)55 {56 printf("%d\n",i);57 break;58 }59 }60 61 }62 return 0;63 }

 

  

转载于:https://www.cnblogs.com/pcpcpc/archive/2012/09/06/2673744.html

你可能感兴趣的文章
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>
让IE浏览器支持CSS3圆角属性的方法
查看>>
巡风源码阅读与分析---nascan.py
查看>>
LiveBinding应用 dataBind 数据绑定
查看>>
Linux重定向: > 和 &> 区别
查看>>
nginx修改内核参数
查看>>
C 筛选法找素数
查看>>
TCP为什么需要3次握手与4次挥手(转载)
查看>>
IOC容器
查看>>
Windows 2003全面优化
查看>>
URAL 1002 Phone Numbers(KMP+最短路orDP)
查看>>