0.04 (被抓住的概率p) 3(银行个数)
1(银行的钱) 0.02(人被抓住的概率)
2 0.03
3 0.05
求人在不被抓住的情况下抢劫的最大数目
const int N=101; struct bank{ int money; double p; //逃跑的概率 }banks[N]; double dp[N*N]; //dp[i]:抢劫的钱为i成功逃跑的概率 int main(){ int t,n,i,j,maxmoney; double p; cin>>t; while(t--){ maxmoney=0; memset(dp,0.0,sizeof(dp)); dp[0]=1.0; scanf("%lf %d",&p,&n); p=1.0-p; //人逃跑的概率 for(i=1;i<=n;i++){ scanf("%d %lf",&banks[i].money,&banks[i].p); banks[i].p=1.0-banks[i].p; //各个银行逃跑的概率 maxmoney+=banks[i].money; //总的钱 } for(i=1;i<=n;i++) //抢劫第i个银行 for(j=maxmoney;j>=banks[i].money;j--) // dp[j]=max(dp[j-banks[i].money]*banks[i].p,dp[j]);//乘法原理 for(i=maxmoney;;i--){ if(dp[i]>p){ //能逃跑的最大钱数 printf("%d\n",i); break; } } } return 0; }