• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            USACO 3.3 Shopping Offers

            背包問題,dp解決。
            dp[i][j][k][m][n]表示第0-4種物品分別購買i-n個時,所需的最小費用。
            那么對于每一個offer
            dp[i][j][k][m][n] = min ( dp[i][j][k][m][n], dp[i-o[0]][j-o[1]][k-o[2]][m-o[3]][n-o[4]]+offer.cost);

            analysis中提出用最短路徑的方法來解,思路很巧妙。把”裝有不同種數和數量的物品“的籃子看作結點,把offer作為邊(把購買一件物品的原始價格看成一種退化的offer),把價格作為邊長度。這樣就轉換成從籃子(0,0,0,0,0)到所求結點的最短路徑問題。

            代碼如下:
            #include?<iostream>
            #include?
            <fstream>

            using?namespace?std;

            ifstream?fin(
            "shopping.in");
            ofstream?fout(
            "shopping.out");

            #ifdef?_DEBUG
            #define?out?cout
            #define?in?cin
            #else
            #define?out?fout
            #define?in?fin
            #endif

            int?dp[6][6][6][6][6];

            struct?offer{
            ????
            int?pro_num;
            ????
            int?price;
            ????
            int?product[5];
            ????
            int?amount[5];
            };

            int?offer_num;
            offer?offers[
            100];
            int?map[1000]; //product id到”按物品出現順序所給的編號“的映射
            int?price[1000];//product id對應的物品價格
            int?product_num;//物品總數目
            int?products[5];//存放product id
            int?amount[5];//product 所需的數量

            void?solve()
            {
            ????
            in>>offer_num;

            ????
            for(int?i=0;i<offer_num;++i){
            ????????
            in>>offers[i].pro_num;
            ????????
            for(int?j=0;j<offers[i].pro_num;++j){
            ????????????
            in>>offers[i].product[j]>>offers[i].amount[j];
            ????????}
            ????????
            in>>offers[i].price;
            ????}
            ????
            ????
            int?pro_idx?=?0;

            ????
            in>>product_num;

            ????
            for(int?i=0;i<product_num;++i){
            ????????
            in>>products[i];
            ????????
            in>>amount[i];
            ????????
            in>>price[i];
            ????????map[?products[i]?]?
            =?i;
            ????}

            ??? //沒有折扣時的價格
            ????
            for(int?i=0;i<=5;++i)
            ????????
            for(int?j=0;j<=5;++j)
            ????????????
            for(int?k=0;k<=5;++k)
            ????????????????
            for(int?m=0;m<=5;++m)
            ????????????????????
            for(int?n=0;n<=5;++n){
            ????????????????????????dp[i][j][k][m][n]?
            =?
            ????????????????????????????price[
            0]*i+
            ????????????????????????????price[
            1]*j+
            ????????????????????????????price[
            2]*k+
            ????????????????????????????price[
            3]*m+
            ????????????????????????????price[
            4]*n;
            ????????????????????}

            ????
            for(int?i=0;i<=5;++i)
            ????????
            for(int?j=0;j<=5;++j)
            ????????????
            for(int?k=0;k<=5;++k)
            ????????????????
            for(int?m=0;m<=5;++m)
            ????????????????????
            for(int?n=0;n<=5;++n){
            ????????????????????????
            int?tmp[5];
            ????????????????????????
            for(int?s=0;s<offer_num;++s){

            ????????????????????????????memset(tmp,
            0,sizeof(tmp));????
            ????????????????????????????
            for(int?t=0;t<offers[s].pro_num;++t){
            ????????????????????????????????tmp[map[offers[s].product[t]]]?
            =?offers[s].amount[t];
            ????????????????????????????}

            ????????????????????????????
            if(i>=tmp[0]&&j>=tmp[1]&&k>=tmp[2]&&m>=tmp[3]&&n>=tmp[4]){
            ????????????????????????????????dp[i][j][k][m][n]?
            =?min(?dp[i][j][k][m][n],
            ????????????????????????????????????????dp[i
            -tmp[0]][j-tmp[1]][k-tmp[2]][m-tmp[3]][n-tmp[4]]+
            ????????????????????????????????????????offers[s].price);
            ????????????????????????????}
            ????????????????????????}
            ????????????????????}

            ????
            out<<dp[amount[0]][amount[1]][amount[2]][amount[3]][amount[4]]<<endl;
            }

            int?main(int?argc,char?*argv[])
            {
            ????solve();?
            ????
            return?0;
            }


            上面代碼有個嚴重的bug,謝謝網友“我也湊熱鬧"指出。由于map所有值都為0。所以未在商品列表中出現的商品的map值都為0,即都映射為第一個商品。現改成將map初始化為-1,并增加判斷語句。此外將初始化dp的語句合并到后面,以簡化代碼。


            #include?<iostream>
            #include?
            <fstream>

            using?namespace?std;

            ifstream?fin(
            "shopping.in");
            ofstream?fout(
            "shopping.out");

            #ifdef?_DEBUG
            #define?out?cout
            #define?in?cin
            #else
            #define?out?fout
            #define?in?fin
            #endif

            int?dp[6][6][6][6][6];

            struct?offer{
            ????
            int?pro_num;
            ????
            int?price;
            ????
            int?product[5];
            ????
            int?amount[5];
            };

            int?offer_num;
            offer?offers[
            100];
            int?map[1000];
            int?price[1000];
            int?product_num;
            int?products[5];
            int?amount[5];

            void?solve()
            {
            ????
            in>>offer_num;

            ????
            for(int?i=0;i<offer_num;++i){
            ????????
            in>>offers[i].pro_num;
            ????????
            for(int?j=0;j<offers[i].pro_num;++j){
            ????????????
            in>>offers[i].product[j]>>offers[i].amount[j];
            ????????}
            ????????
            in>>offers[i].price;
            ????}
            ????
            ????
            int?pro_idx?=?0;

            ????
            in>>product_num;

            ????
            //2009.07.27修改
            ????memset(map,-1,sizeof(map));

            ????
            for(int?i=0;i<product_num;++i){
            ????????
            in>>products[i];
            ????????
            in>>amount[i];
            ????????
            in>>price[i];
            ????????map[?products[i]?]?
            =?i;
            ????}

            ????
            for(int?i=0;i<=5;++i)
            ????????
            for(int?j=0;j<=5;++j)
            ????????????
            for(int?k=0;k<=5;++k)
            ????????????????
            for(int?m=0;m<=5;++m)
            ????????????????????
            for(int?n=0;n<=5;++n){

            ?????????????????????????dp[i][j][k][m][n]?
            =?
            ????????????????????????????price[
            0]*i+
            ????????????????????????????price[
            1]*j+
            ????????????????????????????price[
            2]*k+
            ????????????????????????????price[
            3]*m+
            ????????????????????????????price[
            4]*n;

            ????????????????????????
            int?tmp[5];
            ????????????????????????
            for(int?s=0;s<offer_num;++s){
            ????????????????????????????memset(tmp,
            0,sizeof(tmp));????
            ????????????????????????????
            for(int?t=0;t<offers[s].pro_num;++t){
            ????????????????????????????????
            //2009.07.27修改
            ????????????????????????????????if(?map[offers[s].product[t]]!=-1)
            ????????????????????????????????????tmp[map[offers[s].product[t]]]?
            =?offers[s].amount[t];
            ????????????????????????????}

            ????????????????????????????
            if(i>=tmp[0]&&j>=tmp[1]&&k>=tmp[2]&&m>=tmp[3]&&n>=tmp[4]){
            ????????????????????????????????dp[i][j][k][m][n]?
            =?min(?dp[i][j][k][m][n],
            ????????????????????????????????????????dp[i
            -tmp[0]][j-tmp[1]][k-tmp[2]][m-tmp[3]][n-tmp[4]]+
            ????????????????????????????????????????offers[s].price);
            ????????????????????????????}
            ????????????????????????}
            ????????????????????}

            ????
            out<<dp[amount[0]][amount[1]][amount[2]][amount[3]][amount[4]]<<endl;
            }

            int?main(int?argc,char?*argv[])
            {
            ????solve();?
            ????
            return?0;
            }




            posted on 2009-07-07 19:16 YZY 閱讀(447) 評論(2)  編輯 收藏 引用 所屬分類: Algorithm動態規劃圖論

            評論

            # re: USACO 3.3 Shopping Offers 2009-07-27 11:18 我也湊熱鬧

            我懷疑你有一個地方是錯誤的。就是你用map映射的地方。注意題目并沒說優惠中的商品一定出現在購買的之中。

            所以類似
            1
            1 3 2 5
            1
            4 2 3
            答案應該是6而不是5
            對吧?  回復  更多評論   

            # re: USACO 3.3 Shopping Offers 2009-07-27 14:09 YZY

            是的,確實有問題。因為map的初始化值為0。這樣所有未出現在優惠商品中的商品的map值都變成第一個商品了。謝謝你指出錯誤。  回復  更多評論   

            導航

            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            亚洲国产精品久久66| 亚洲国产欧美国产综合久久| 亚洲国产二区三区久久| 久久综合狠狠综合久久激情 | 色噜噜狠狠先锋影音久久| 精品久久久久久无码人妻热 | 国内精品久久久久伊人av| 色综合久久综合网观看| 亚洲欧美一区二区三区久久| 久久99亚洲网美利坚合众国| 无码任你躁久久久久久| 久久久久久亚洲Av无码精品专口| 久久成人18免费网站| 久久久久女人精品毛片| 青青草国产97免久久费观看| 国产精品久久久久jk制服| 久久99热这里只频精品6| segui久久国产精品| 久久久无码精品亚洲日韩按摩| 欧美久久天天综合香蕉伊| 国产精品久久久久久久久免费| 99精品久久精品一区二区| 久久综合色之久久综合| 国产午夜精品久久久久九九电影 | 久久久这里有精品中文字幕| 伊人久久精品无码av一区| 久久国产视屏| 久久久久国产精品嫩草影院 | 久久成人18免费网站| 久久精品国产亚洲沈樵| 国产成人精品白浆久久69| 漂亮人妻被黑人久久精品| 中文字幕无码免费久久| 囯产极品美女高潮无套久久久 | 久久久久香蕉视频| 九九久久精品国产| 国产99久久久国产精品~~牛 | 久久亚洲国产成人影院| 久久久久青草线蕉综合超碰| 久久久久se色偷偷亚洲精品av| 99久久综合国产精品免费|