HDU 2955 Robberies (10背包改编)
2012-08-17 21:34
381 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955
题目大意:
这个小偷想偷银行的钱
给你被抓的最大概率,和N家银行
下面N行代表的是这家银行都多少钱,和被抓的最大概率。
有这时候我们关键的是怎么写出动态方程出来
我们学习的10背包是两种方面构成的,一是背包的最大体积,二是装入背包物品的价值和体积。
我们来模拟这个过程,首先:
将全部银行的钱当做背包的最大体积
那么每家银行的钱则当做物品的体积
那么被抓的概率当做物品的价值
那么便容易推出我们所需要的动态方程:
dp[i]=max(dp[i],(dp[i-money]*(1-rp))); // money 当前银行钱,rp 当前被抓概率
剩下的就是套模板了
AC代码如下:
题目大意:
这个小偷想偷银行的钱
给你被抓的最大概率,和N家银行
下面N行代表的是这家银行都多少钱,和被抓的最大概率。
有这时候我们关键的是怎么写出动态方程出来
我们学习的10背包是两种方面构成的,一是背包的最大体积,二是装入背包物品的价值和体积。
我们来模拟这个过程,首先:
将全部银行的钱当做背包的最大体积
那么每家银行的钱则当做物品的体积
那么被抓的概率当做物品的价值
那么便容易推出我们所需要的动态方程:
dp[i]=max(dp[i],(dp[i-money]*(1-rp))); // money 当前银行钱,rp 当前被抓概率
剩下的就是套模板了
AC代码如下:
#include<iostream> #include<stdio.h> using namespace std; double dp[10050]; double RP; int num; double rp[10050]; int money[10050]; int sum; double max(double a,double b) { if(a>b) return a; else return b; } void ZeroOnePack(int money,double rp) { int i; for(i=sum;i>=money;i--) dp[i]=max(dp[i],(dp[i-money]*(1-rp))); //方程,储存概率(相当于价值) } int main() { int Case; scanf("%d",&Case); while(Case--) { scanf("%lf %d",&RP,&num); sum=0; int i; memset(dp,0,sizeof(dp)); for(i=0;i<num;i++) { scanf("%d %lf",&money[i],&rp[i]); sum=sum+money[i]; //将全部银行的钱当做背包总体积 } dp[0]=1; for(i=0;i<num;i++) ZeroOnePack(money[i],rp[i]); //每间银行的钱当做一个物品体积 for(i=sum;i>=0;i--) //倒搜 { if(dp[i]>=(1-RP)) { printf("%d\n",i); break; } } } return 0; }
相关文章推荐
- Robberies - HDU 2955 背包
- hdu 2955 Robberies(背包问题)
- HDU 2955 Robberies (01背包,思路要转换一下,推荐!)
- 01背包水题篇之 HDU2955——Robberies
- HDU 2955 Robberies(01背包变型)
- HDU 2955-Robberies(01背包变形)
- hdu 2955 Robberies 背包DP
- HDU_2955_Robberies(01背包,需动脑子)
- hdu 2955 Robberies + LightOJ 1079 Just another Robbery (01背包 概率)
- hdu 2955 Robberies(01背包变形)
- 动态规划:HDU-2955-0-1背包问题:Robberies
- HDU 2955 Robberies(0-1背包)
- HDU 2955 Robberies(变形背包) 4000
- HDU 2955 Robberies抢劫案(01背包,变形)
- hdu 2955 Robberies(概率01背包,反向思维)
- HDU 2955 Robberies(经典01背包概率问题)
- HDU 2955 Robberies (背包)
- hdu 2955 Robberies(01背包变形)
- Hdu 2955 Robberies 0/1背包
- hdu 2955 Robberies--01背包