hdu2955

来源:互联网 发布:数据库ip地址查询器 编辑:程序博客网 时间:2024/05/29 17:27
#include<stdio.h>#include<string.h>double max(double a,double b){return a>b?a:b;}double dp[10005];int main(){int t,i,j,sum,n,w[105];double p[105],s;scanf("%d",&t);while(t--){scanf("%lf%d",&s,&n);sum=0;memset(dp,0,sizeof(dp));for(i=0;i<n;i++){scanf("%d%lf",&w[i],&p[i]);sum+=w[i];p[i]=1-p[i];}dp[0]=1;for(i=0;i<n;i++)for(j=sum;j>=w[i];j--)dp[j]=max(dp[j],dp[j-w[i]]*p[i]);  for(i=sum;i>=0;i--)  if(dp[i]>=1-s)  break;  printf("%d\n",i);}return 0;}题意:Roy要偷银行,每个银行都有一个被抓到的概率,Roy的妈妈算出一个不被抓到的概率上限,要求求出Roy偷到最多的钱且不超过被抓到的概率上限。正难则反, 状态转移方程则为  dp[ v ] = max( dp[ v - w[ i ] ] * p[ i ] , dp[ v ] ) , dp[ v ] 表示偷到  v  元逃脱的概率, w[ i ] 表示从第 i 个银行能偷到的钱, p[ i ] 表示偷第 i 个银行逃脱的概率。

0 0
原创粉丝点击