简单题意
知道每家银行的存钱,和抢劫银行被抓的概率,和自己被抓的最大概率。求出在不被抓的情况下,抢劫最多钱数。
解题思路形成过程
当前状态不被抓的概率等于,不抢这家银行之前不被抓的概率乘抢劫将这家银行不被抓大概率,因此状态转移方程:dp[j]=max(dp[j],dp[j-m[i]]*pro[i]), dp[j]表示抢j钱时的最大不被抓概率。
感想
动态规划的思想真的很精致巧妙
AC代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<fstream>
using namespace std;
double dp[105*105];
int m[105];
double pro[105];
double max(double a,double b){
if(a-b>0)return a;
return b;
}
int main(){
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
int t,n;
double p;
cin>>t;
while(t--){
int sum=0;
cin>>p>>n;
p=1.0-p;
for(int i=1;i<=n;i++){
cin>>m[i]>>pro[i];
pro[i]=1.0-pro[i];
sum+=m[i];
}
memset(dp,0,sizeof(dp));
dp[0]=1.0;
for(int i=1;i<=n;i++){
for(int j=sum;j>=m[i];j--){
dp[j]=max(dp[j-m[i]]*pro[i],dp[j]);
}
}
for(int i=sum;i>=0;i--){
if(dp[i]>p){
cout<<i<<endl;
break;
}
}
}
return 0;
}