HDU1203(初識01揹包)

2021-10-06 13:22:10 字數 1397 閱讀 8652

原題鏈結

01揹包是在m件物品取出若干件放在空間為w的揹包裡,每件物品的體積為w1,w2至wn,與之相對應的價值為p1,p2至pn。

01揹包的約束條件是給定幾種物品,每種物品有且只有乙個,並且有權值和體積兩個屬性。因為每種物品只有乙個,對於每個物品只需要考慮選與不選兩種情況。

hdu1203很明顯是一道入門01揹包的模板題。

speakless所攢的錢的總數 -----> 包的容量

可能被錄取的學校的申請費用 -----> 物品的體積

被學校錄取的概率 -----> 物品的價值

speakless可能得到至少乙份offer的最大概率 ------> 包所能裝的物品的最大價值

問題所要求的是speakless可能得到至少乙份offer的最大概率,學校數量小的話還好,若是數量大了,我們很難把所有情況一一枚舉出來,因此,我們要從另乙個角度解決這個問題:先求出speakless連一所學校都申請不到的最小概率然後用1減去這個最小概率再乘以100,結果就是題目所求的值。

一般的狀態轉移方程:

for

( i =

1; i <= m ; i++

)for

( j =

1; j <= all_money ; j++

) dp[i]

[j]=

min( dp[i-1]

[j], dp[i-1]

[j-money[i]]*

(1-rate[i]))

;

但是用二維陣列進行儲存會爆記憶體,因此我們要對空間複雜度進行優化:

for

( i =

1; i <= m ; i++

)for

( j = all_money ; j >= money[i]

; j--

)//從最後面開始初始化dp陣列,因為前面dp陣列元素是還沒有加入第i個物品時的價值,

//後面的最大價值就是沒有加入第i個物品時的價值推得,

//若是從最前面開始賦值,那麼陣列元素都是由加入了第i個物品的價值推得。

dp[j]

=min

( dp[j]

, dp[j-money[i]]*

(1-rate[i]))

;

ac**:

#include

float

min(

float a ,

float b )

intmain

(void

)return0;

}

hdu1203 簡單01揹包

problem description speakless很早就想出國,現在他已經考完了所有需要的考試,準備了所有要準備的材料,於是,便需要去申請學校了。要申請國外的任何大學,你都要交納一定的申請費用,這可是很驚人的。speakless沒有多少錢,總共只攢了n萬美元。他將在m個學校中選擇若干的 當然...

hdu 1203(完全揹包)

problem description speakless很早就想出國,現在他已經考完了所有需要的考試,準備了所有要準備的材料,於是,便需要去申請學校了。要申請國外的任何大學,你都要交納一定的申請費用,這可是很驚人的。speakless沒有多少錢,總共只攢了n萬美元。他將在m個學校中選擇若干的 當然...

初識0 1依賴揹包

hdu3449 題意 給定物品的組數n和一開始擁有的錢數m,後面n行輸入代表n組物品,若要購買該組物品中的乙個或多個都需要先購買盒子,盒子無價值,每組物品中最開始兩個數bp和mi分別表示盒子的 和該組物品的種數,問用m元最多可獲得貨物的最 值是多少。思路 典型的有依賴的0 1揹包問題,根據dd大牛的...