HDU 2955 Robberies(01背包)(动态规划)
来源:互联网 发布:win7 传奇3 数据库 编辑:程序博客网 时间:2024/06/04 19:52
Robberies
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18375 Accepted Submission(s): 6797
For a few months now, Roy has been assessing the security of various banks and the amount of cash they hold. He wants to make a calculated risk, and grab as much money as possible.
His mother, Ola, has decided upon a tolerable probability of getting caught. She feels that he is safe enough if the banks he robs together give a probability less than this.
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
30.04 31 0.022 0.033 0.050.06 32 0.032 0.033 0.050.10 31 0.032 0.023 0.05
246
对于背包还是理解不是很透,看了某个人的博客,才对背包有了个大体稍微深入的了解,但现在还是不能独立自主的将思路和代码实现,希望近期努力能让我彻底掌握这类题型吧,至少独立的ac此类题目啊!!!
下面是某大神的简单解释http://blog.csdn.net/mu399/article/details/7722810
01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。
01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
题目描述:
有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
只要你能通过找规律手工填写出上面这张表就算理解了01背包的动态规划算法。
首先要明确这张表是至底向上,从左到右生成的。
为了叙述方便,用e2单元格表示e行2列的单元格,这个单元格的意义是用来表示只有物品e时,有个承重为2的背包,那么这个背包的最大价值是0,因为e物品的重量是4,背包装不了。
对于d2单元格,表示只有物品e,d时,承重为2的背包,所能装入的最大价值,仍然是0,因为物品e,d都不是这个背包能装的。
同理,c2=0,b2=3,a2=6。
对于承重为8的背包,a8=15,是怎么得出的呢?
根据01背包的状态转换方程,需要考察两个值,
一个是f[i-1,j],对于这个例子来说就是b8的值9,另一个是f[i-1,j-Wi]+Pi;
在这里,
f[i-1,j]表示我有一个承重为8的背包,当只有物品b,c,d,e四件可选时,这个背包能装入的最大价值
f[i-1,j-Wi]表示我有一个承重为6的背包(等于当前背包承重减去物品a的重量),当只有物品b,c,d,e四件可选时,这个背包能装入的最大价值
f[i-1,j-Wi]就是指单元格b6,值为9,Pi指的是a物品的价值,即6
我的代码如下:
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;double dp[10005];struct probability{ int value; double chance;}rob[105];int main(){ int t,n; double p; cin>>t; while(t--) { scanf("%lf%d",&p,&n); int sum=0; for(int i=0;i<n;i++) { scanf("%d%lf",&rob[i].value,&rob[i].chance); sum+=rob[i].value; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<n;i++) for(int j=sum;j>=rob[i].value;j--) { dp[j]=max(dp[j],dp[j-rob[i].value]*(1-rob[i].chance)); } for(int i=sum;i>=0;i--) if(dp[i]>1-p) { cout<<i<<endl; break; } } return 0;}
- HDU 2955 Robberies(01背包)(动态规划)
- 动态规划专题(01背包)HDU 2955-Robberies
- 动态规划:HDU-2955-0-1背包问题:Robberies
- hdu 2955 Robberies(01背包)
- hdu 2955 Robberies(01背包)
- hdu 2955 Robberies(01背包)
- hdu 2955 Robberies(01背包)
- hdu 2955 Robberies(01背包)
- HDU 2955 Robberies (01背包)
- hdu-2955(01背包)Robberies
- HDU 2955 Robberies(01背包变型)
- HDU 2955 Robberies (01背包)
- HDU 2955 Robberies(01背包)
- HDU 2955 Robberies (01背包)
- HDU - 2955 Robberies(01背包)
- HDU 2955 Robberies(01背包问题)
- hdu 2955 Robberies(01背包)
- hdu 2955 Robberies(01背包)
- Problem D: 求最高同学位置
- 19. Remove Nth Node From End of List
- 58. Length of Last Word
- mac与windows系统的互相访问
- python数据类型--字典
- HDU 2955 Robberies(01背包)(动态规划)
- 299. Bulls and Cows
- BZOJ1901: Zju2112 Dynamic Rankings
- 将任意类型转为number类型
- xcode7编译老版本程序时提示错误的处理方法
- java核心技术笔记
- 290. Word Pattern
- Windows 基于udp的socket编程(课程代码基础上修改)
- 斜率游戏:8*8==13*5