博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Harry Potter Robber
阅读量:5075 次
发布时间:2019-06-12

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

题目链接:

题意:

       哈利珀特想要抢劫银行,他有n个目标银行,而且为避免被捕风险,他的朋友为他计算出了他被抓风险一定要低于np,否则抢劫会失败,给出目标银行能被抢劫的一定金额数和在该银行抢劫被抓到的概率,问哈利在不被抓的情况下,抢劫的钱最多能有多少?

案例:

       Sample Input

       3

       0.04 3

       1 0.02

       2 0.03

       3 0.05

       0.06 3

       2 0.03

       2 0.03

       3 0.05

       0.10 3

       1 0.03

       2 0.02

       3 0.05

       Sample Output

       Case 1: 2

       Case 2: 4

       Case 3: 6

分析:

       背包问题,打表。

       做一个简单转换,把银行总钱sum作为背包容量,把(1-p[i])作为重量W,背包问题模版可以参考紫书《算法竞赛入门经典》。 然后倒叙,找出可以偷出的最多的钱。

源代码:

1 #include
2 #include
3 int n,a[105],sum,count; 4 double np,p[105],dp[10005]; 5 double max(double x,double y) 6 { 7 return x>y?x:y; 8 } 9 void judge()10 {11 int j,k;12 memset(dp,0,sizeof(dp));13 dp[0]=1;14 for(k=1;k<=n;k++)//记录抢劫价值j被捕的概率15 for(j=sum;j>=a[k];j--)16 {17 dp[j]=max(dp[j-a[k]]*(1-p[k]),dp[j]);18 }19 for(count=sum;count>=0;count--)20 if(dp[count]>1-np)21 break;22 }23 int main()24 {25 int T,cnt=0;26 scanf("%d",&T);27 while(T--)28 {29 sum=0;30 scanf("%lf%d",&np,&n);31 for(int i=1;i<=n;i++)32 {33 scanf("%d%lf",&a[i],&p[i]);34 sum+=a[i];//总价值35 }36 judge();37 printf("Case %d: %d\n",++cnt,count);38 }39 return 0;40 }

 

转载于:https://www.cnblogs.com/huaszjh/p/4743393.html

你可能感兴趣的文章
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
sqlite的坑
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
Jquery ui widget开发
查看>>
关于indexOf的使用
查看>>
英语单词
查看>>
centos6.8下安装matlab2009(图片转帖)
查看>>
Mongo自动备份
查看>>
cer证书签名验证
查看>>
新手Python第一天(接触)
查看>>
【bzoj1029】[JSOI2007]建筑抢修
查看>>
synchronized
查看>>
codevs 1080 线段树练习
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
QML学习笔记之一
查看>>
Window 的引导过程
查看>>
App右上角数字
查看>>