当前位置: 代码迷 >> 综合 >> HDU 2955 Robberies 01背包 .
  详细解决方案

HDU 2955 Robberies 01背包 .

热度:62   发布时间:2023-09-23 07:05:14.0

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2955

算逃跑概率,并不是被抓住的概率相加

因为风险是小数,所以不能表示进数组里,所以DP数组d[i]保存 抢到i元的最大逃跑概率

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
double d[10000+5];
//d[i]表示前抢到i元的最大逃跑概率 
int main()
{int T; cin>>T; while(T--){int n=0;double risk;cin>>risk>>n; risk=1-risk;memset(d,0,sizeof(d));d[0]=1.0;int ans=0,sum=0;for(int i=0;i<n;i++){int m; double p;cin>>m>>p; sum+=m;for(int j=sum;j>=0;j--){if(j>=m) d[j]=max(d[j-m]*(1-p),d[j]);\else break;if(risk<=d[j]) ans=max(ans,j);} }cout<<ans<<endl;}return 0;
}