01 背包 专题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013514722/article/details/41408475

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时为满足要求的钱数。


猜你喜欢

转载自blog.csdn.net/u013514722/article/details/41408475
今日推荐