HDU 2955 Robberies 小數揹包

2021-08-21 10:10:00 字數 542 閱讀 5038

參考資料:

題意:乙個人要去搶銀行,給定n個銀行各自的總存款和此人在這個銀行被抓的概率,求被抓概率小於p的情況下搶錢數的最大值。

這裡可以轉化為0/1揹包問題。

要點:1.概率給的是被抓概率,需要轉化為不被抓的概率。(用1-p[i])

2.揹包容量不能是概率(小數),揹包容量應該為錢數總和。

3.限制條件之間關係為相乘關係(概率的原理)

整體思路:

1.輸入資料,並進行轉換。

2.利用錢數總和作揹包容量,利用不被抓概率做限制條件,進行0/1揹包。

3.錢數總和逆序列舉,找出不被抓的最大錢數,輸出。

一些細節:

1.0/1揹包問題,需要對揹包容量作逆序列舉,否則變成完全揹包問題。

2.dp陣列的含義是不被抓概率,並不是結果所需答案。

核心**:

for(int i = 0; i < n; i ++)

}

hdu 2955 Robberies 01揹包變形

include include include include double f 10001 double maxn double maxs double a,double b int main for i m i 0 i if f i maxn 1e 12 break printf d n i r...

HDU 2955 Roberies 揹包問題

疑問點 如何轉化成0 1揹包問題,有點不好理解,先打個大大的問號?上限概率轉化為最小的安全概率即p 1 p 被活捉的概率為pj,安全概率即為pj 1 pj 定義的容量為m sumv,對應的錢數為m1,m2,m3.求最大的安全概率,且要求安全概率大於p include include include ...

hdu 2955 Robberies(揹包變形)

這道題麻煩的是概率這東西沒法用個迴圈表示出來,根據我以往的經驗,指望著把給出的測試資料乘上一百或者一萬這種方法是完全不可取的。乍一看,這道題目是拿概率當包,因為概率是浮點數,如果是想像普通揹包一樣處理,那是完全行不通的。但是把題目轉換一下,題目給出的概率是被抓的概率,我們可以把所有銀行能搶的錢的總和...