1. 程式人生 > >01 揹包 專題

01 揹包 專題

1.   hdu    2546 飯卡

      分析:    1,當卡上金額小於5元時,不能買任何菜。

                       2,否則,狀態轉移方程: f[ j ] = max ( f [ j ] , f [ j -price [ i ] ]+price [ i ] ); 

     f [ j ]表示買第 i個菜時的預算為 j = m-5 時的最大開銷。

                        排序是為了選出最貴的菜,可以不排序直接選。

             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,特徵方程與上題差不多,不多說了。

3.  hdu    1864   最大銷售額

   題意:

                 現有一筆經費可以報銷一定額度的發票。允許報銷的發票型別包括買圖書(A類)、文具(B類)、差旅(C類),要求每張發票的總額不得超過1000元,每張發票上,單項物品的價值不得超過600元。現請你編寫程式,在給出的一堆發票中找出可以報銷的、不超過給定額度的最大報銷額。

     分析:   1.只要精確兩位小數,為了避免用double 數做揹包容量造成的精度損失,將其*100放大為整數;

                     2. 對每張發票進行篩選,選出 價值陣列。

                     3.  利用轉移方程處理。

4。hdu    2955     Robberiers
   題意:

               去銀行搶錢,每一家銀行有一定的錢數和搶錢被捉住的概率,問你在不超過給出的被捉住的最大概率 p 情況下求搶得得錢數最多。

      分析:    由於不能用double 做揹包榮量,要進行一些小的處理:

                       1.  求出搶每家銀行能逃跑的概率;

                        2。 用所有銀行金額的總和做揹包容量,那麼最後逃跑概率的乘積應大於1-p時為滿足要求的錢數。