第一次果断吧概率当成背包了,放大100000倍,而且强多家银行的概率是相乘,不是相加啊
将抢的钱数当成背包转移公式:
dp[j]表示在能抢到j百万的时候成功的最大概率
dp[j]=max(dp[j],dp[j-m[i]]*(1-p_bank[i]));
/************************************************************************* > File Name: hdu2955.cpp > Author: yang > Mail:[email protected] > Created Time: 2014年08月23日 星期六 10:57:47 ************************************************************************/ #include<iostream> #include<stdio.h> #include<memory.h> using namespace std; #define N 105 int main(){ // freopen("in.txt","r",stdin); int t,n; double dp[10010]; cin>>t; int m[N]; double p_bank[N],p_thief; while(t--){ cin>>p_thief>>n; int sum=0; for(int i=0;i<n;i++){ cin>>m[i]>>p_bank[i]; sum+=m[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<n;i++){ for(int j=sum;j>=m[i];j--){ dp[j]=max(dp[j],dp[j-m[i]]*(1-p_bank[i])); } } for(int i=sum;i>=0;i--){ if(dp[i]>(1-p_thief)){ printf("%d\n",i); break; } } } }
时间: 2024-11-09 02:01:23