博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2955 ( Robberies ) 变相01 背包 DP
阅读量:5322 次
发布时间:2019-06-14

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

地址连接:

Roy 去抢N个银行,去抢第j个银行时能得到Mj的钱,被抓的概率为Pj。

问在被抓的概率不大于P时能抢到的最多的钱是多少。

这道题一开始我以为用P去当背包容量,但是P是double型,所以制定不行= =。。然后没大有思路。。。

后来看到网上的思路就是逆向思维,将钱的总数当做背包容量~

于是转成以所有银行的总资产为背包容量V。。求最大的逃跑概率。。

也就是我们一个都不偷的时候我们逃跑的概率为1,每当我们偷了一个我们都要*(1-p[i])我们成功逃跑的概率

状态转移方程:dp[j] = max ( dp[j], dp[j-cost[i]] * (1-pi[i])..//偷了cost[i]之后,然后就有可能被抓所以要乘以~

代码:

View Code
1 #include 
2 #include
3 int main() 4 { 5 int i,n,j,sum,T; 6 scanf("%d",&T); 7 while(T--) 8 { 9 double p,pi[105],dp[100005];10 int mon[105];11 sum = 0;12 scanf("%lf %d",&p,&n);13 for(i = 0;i < n;i++)14 {15 scanf("%d %lf",&mon[i],&pi[i]);16 sum+=mon[i];17 }18 19 memset(dp,0,sizeof(dp));20 dp[0] = 1.0;21 for(i = 0;i < n;i++)22 {23 for(j = sum;j >= mon[i];j--)24 {25 if(dp[j] < dp[j-mon[i]]*(1-pi[i]))26 dp[j] = dp[j-mon[i]]*(1-pi[i]);27 28 }29 }30 for(i = sum;i >= 0;i--)31 if(dp[i] >= 1-p)32 break;33 34 printf("%d\n",i);35 }36 return 0;37 }

转载于:https://www.cnblogs.com/0803yijia/archive/2012/08/14/2638899.html

你可能感兴趣的文章
AngularJs自定义指令详解(5) - link
查看>>
从“埋点技术已死?”开始说起
查看>>
[配置Cordova环境] [Alfred使用手册]
查看>>
EFCode First 导航属性
查看>>
嵌入式Linux开发
查看>>
Swift语法初见
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
前端基础之html
查看>>
I - Agri-Net - poj 1258
查看>>
git 的回退
查看>>
C语言编程题002
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
Confluence配置数据库
查看>>
Java锁机制(一)synchronized
查看>>
002.文件删除功能
查看>>
[转载]电脑小绝技
查看>>
C#动态创建和动态使用程序集、类、方法、字段等(二)
查看>>
浅谈UML之交互图
查看>>
Telink BLE MESH PWM波的小结
查看>>
asp.net mvc 获取ajax的 request payload 参数
查看>>