hdu 2955 (简单dp)
来源:互联网 发布:淘宝客关键词选择 编辑:程序博客网 时间:2024/05/29 02:11
题意:某个人去抢银行 但是有一个概率p 如果被抓的概率小于p 它的妈妈才会同意他去抢银行 有n个银行 每个银行的钱和被抓的概率
让你计算他可以在不被抓的情况下抢到的最大money
思路: 简单dp 需要钱的最大数目 就是算出它抢多少钱时候的被抓可能性 如果不被抓 抢到的钱多的话就是这个答案
状态转移方程:dp[j]=max(dp[j],dp[j-money[i]]*(1-p[i]) 可以减去money[i] 说明有足够的钱 抢了i银行 就有不被抓的可能性。 初始化dp[0]=1;
#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;const int maxn=101;const int maxv=10005;float dp[maxv]; //求最大的不被抓概率float p; //被抓的概率要<=pint n;int sum; //银行的总钱数int money[maxn];float prob[maxn];int main(){ int t,val; float pj; scanf("%d",&t); while(t--){ scanf("%f%d",&p,&n); sum=0; for(int i=1;i<=n;i++){ scanf("%d%f",&val,&pj); sum+=val; money[i]=val; //将银行里的钱当成容量 prob[i]=1-pj; //将不被抓的可能性当成价值 } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=n;i++){ for(int j=sum;j>=money[i];j--){ dp[j]=max(dp[j],dp[j-money[i]]*prob[i]);//也就是之前抢劫过money[i] 所以有个不被抓的概率 } } int ans=0; //别忘了初始为0 for(int i=sum;i>=1;i--){ if(dp[i]>=1-p){ ans=i; break; } } printf("%d\n",ans); } return 0;}
0 0
- hdu 2955 (简单dp)
- HDU 1087 简单DP
- hdu 1978 简单dp
- hdu 2830 简单dp
- hdu 2151 简单dp
- hdu 3199 简单dp
- HDU DP 简单题
- hdu 4540(简单dp)
- hdu 2152(简单dp)
- HDU 4502 简单DP
- hdu 1087 简单dp
- HDU 1003(简单dp)
- hdu 1087 简单dp
- hdu 2751 简单dp
- hdu 2084 简单dp
- hdu 2577 简单dp
- hdu 1978 简单dp
- hdu 2059 简单dp
- 宽度自适应进度条
- android.support.v4.app.Fragment和android.app.Fragment区别
- 南邮 OJ 1272 可重复最优分解问题
- C# Serializable
- source insight 阅读乱码问题
- hdu 2955 (简单dp)
- 获取UINavgationController的退出事件
- poj 1094 Sorting It All Out
- sql 身份验证模式
- Mysql 常用命令行大全
- 大型数据库应用解决方案
- Android的Touch事件处理机制介绍
- 南邮 OJ 1275 登山机器人问题
- hdu 5352 MZL's City (最大流 || 费用流)