日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

抢劫(01背包+对立事件)

發(fā)布時間:2025/3/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 抢劫(01背包+对立事件) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目描述

Roy是一個十分狡猾的家伙,最近他正在計劃搶劫銀行。為此,他評估了每家銀行的安全性和每家銀行持有的金錢。但是他知道了自己會被抓住的最大風(fēng)險,如果他搶劫銀行被抓的概率小于這個風(fēng)險,那他就安全了,否則,他會被抓走的。Roy并不希望這發(fā)生,因此,他向你求助,他想知道再安全的情況下,能最多搶到多少錢。

輸入

第一行給出一個整數(shù)T,表示有T組數(shù)據(jù)。

對于每一組測試數(shù)據(jù):

第一行給出一個浮點數(shù)P,表示Roy允許被抓的最大概率,接著是一個整數(shù)N,表示他計劃去搶劫的N個銀行。

接下來的N行,每行給出一個整數(shù)Mi和一個浮點數(shù)Xi,表示搶劫第i個銀行可以獲得Mi金錢,被抓走的概率是Xi。

0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mi <= 100
0.0 <= Xi <= 1.0

輸出

對于每組數(shù)據(jù),輸出一個整數(shù),表示Roy在被抓概率小于P的情況下,能搶到的最多的金錢。

你可以認(rèn)為每家銀行是獨立的。

樣例輸入

3
0.04 3
1 0.02
2 0.03
3 0.05
0.06 3
2 0.03
2 0.03
3 0.05
0.10 3
1 0.03
2 0.02
3 0.05

樣例輸出

2
4
6

分析

  • 題目大意是:讓我們求出在被抓概率小于P的情況下獲得的最多金錢。
  • 這道題的原型是簡單的01背包,但是很多人會誤把被抓的概率當(dāng)成背包容量,把搶到的錢當(dāng)成價值,然后就gg了。除去被抓概率有可能會小到小數(shù)點后多少位不說(數(shù)組難開),被抓的概率也并不像所想的進(jìn)行簡單的加減就可以得到的。
  • 當(dāng)被抓的概率比較難求的時候,我們不妨考慮它的對立事件,也就是成功逃跑的概率。只需要在這個銀行的成功逃跑概率乘于在此之前的成功逃跑概率
    • 現(xiàn)在我們以能打劫的錢的總數(shù)數(shù)作為背包容量,各個銀行可獲得的錢為所占空間,成功逃跑的概率(用1-被抓的概率可以得到)作為物品價值。dp[i]則表示打劫了金錢i后的成功逃跑概。即可按照01背包的模型求解。
    • 狀態(tài)轉(zhuǎn)移方程:dp[j]=max(dp[j],dp[j-cash[i]]*pro[i])
    • 最后從后往前遍歷dp[i]數(shù)組,當(dāng)發(fā)現(xiàn)了打劫了金錢i后的成功逃跑概大于或等于允許的最小成功逃跑概率,就把i輸出,結(jié)束循環(huán)。

代碼如下

#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int maxn=10000+5,maxs=100+5; int cash[maxs]; int T,n,sum=0; double p,dp[maxn],pro[maxs]; int main() {//freopen("test.txt","r",stdin);cin>>T;while(T--){memset(dp,0,sizeof(dp));sum=0;cin>>p>>n;p=1-p;for(int i=1;i<=n;i++){cin>>cash[i]>>pro[i];pro[i]=1-pro[i];//1-被抓的概率可得成功逃跑的概率sum+=cash[i];//各個銀行可獲金錢的總和為背包容量}dp[0]=1;//當(dāng)沒有打劫的時候,成功逃跑的概率為1for(int i=1;i<=n;i++)for(int j=sum;j>=cash[i];j--)dp[j]=max(dp[j],dp[j-cash[i]]*pro[i]);//狀態(tài)轉(zhuǎn)移方程for(int i=sum;i>=0;i--)if(dp[i]>=p){cout<<i<<endl;break;}}return 0; } 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的抢劫(01背包+对立事件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。