01 揹包 專題
1. hdu 2546 飯卡
分析: 1,當卡上金額小於5元時,不能買任何菜。
2,否則,狀態轉移方程: f[ j ] = max ( f [ j ] , f [ j -price [ i ] ]+price [ i ] );
排序是為了選出最貴的菜,可以不排序直接選。
sort(W+1,W+n+1); m=m-5; for(int i=1;i<n;i++) { for(int j=m;j>0;j--) if(j>=W[i]) dp[j]=max(dp[j],dp[j-W[i]]+W[i]); } printf("%d\n",m+5-dp[m]-W[n]);
2. hdu 3466 ( Proud Merchants )
題意:
你有 m 元 錢去一個國家買物品, 這個國家有 n 見物品,每件物品有價格price,價值 Vi ,另外還有一個特徵 Qi,買該物品時你擁有的錢必須比小於Qi才能買到這個 商 品。求能得到的最大的價值。
分析: 1,對每個商品的 Qi - price從小到大排序; 排序原因.
2,特徵方程與上題差不多,不多說了。
題意:
現有一筆經費可以報銷一定額度的發票。允許報銷的發票型別包括買圖書(A類)、文具(B類)、差旅(C類),要求每張發票的總額不得超過1000元,每張發票上,單項物品的價值不得超過600元。現請你編寫程式,在給出的一堆發票中找出可以報銷的、不超過給定額度的最大報銷額。
分析: 1.只要精確兩位小數,為了避免用double 數做揹包容量造成的精度損失,將其*100放大為整數;
2. 對每張發票進行篩選,選出 價值陣列。
3. 利用轉移方程處理。
4。hdu 2955 Robberiers
題意:
去銀行搶錢,每一家銀行有一定的錢數和搶錢被捉住的概率,問你在不超過給出的被捉住的最大概率 p 情況下求搶得得錢數最多。
分析: 由於不能用double 做揹包榮量,要進行一些小的處理:
1. 求出搶每家銀行能逃跑的概率;
2。 用所有銀行金額的總和做揹包容量,那麼最後逃跑概率的乘積應大於1-p時為滿足要求的錢數。