• <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個(gè)時(shí),所需的最小費(fèi)用。
            那么對(duì)于每一個(gè)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中提出用最短路徑的方法來解,思路很巧妙。把”裝有不同種數(shù)和數(shù)量的物品“的籃子看作結(jié)點(diǎn),把offer作為邊(把購買一件物品的原始價(jià)格看成一種退化的offer),把價(jià)格作為邊長(zhǎng)度。這樣就轉(zhuǎn)換成從籃子(0,0,0,0,0)到所求結(jié)點(diǎn)的最短路徑問題。

            代碼如下:
            #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到”按物品出現(xiàn)順序所給的編號(hào)“的映射
            int?price[1000];//product id對(duì)應(yīng)的物品價(jià)格
            int?product_num;//物品總數(shù)目
            int?products[5];//存放product id
            int?amount[5];//product 所需的數(shù)量

            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;
            ????}

            ??? //沒有折扣時(shí)的價(jià)格
            ????
            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;
            }


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


            #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 閱讀(441) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Algorithm動(dòng)態(tài)規(guī)劃圖論

            評(píng)論

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

            我懷疑你有一個(gè)地方是錯(cuò)誤的。就是你用map映射的地方。注意題目并沒說優(yōu)惠中的商品一定出現(xiàn)在購買的之中。

            所以類似
            1
            1 3 2 5
            1
            4 2 3
            答案應(yīng)該是6而不是5
            對(duì)吧?  回復(fù)  更多評(píng)論   

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

            是的,確實(shí)有問題。因?yàn)閙ap的初始化值為0。這樣所有未出現(xiàn)在優(yōu)惠商品中的商品的map值都變成第一個(gè)商品了。謝謝你指出錯(cuò)誤。  回復(fù)  更多評(píng)論   

            導(dǎo)航

            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            統(tǒng)計(jì)

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            精品久久久久久久无码 | 思思久久99热只有频精品66| 狠狠色综合久久久久尤物| 欧美久久久久久午夜精品| 国内精品久久久久影院老司| 久久国产精品99精品国产| 99久久婷婷国产综合精品草原| 一本大道久久东京热无码AV| 国产成人久久精品激情| 久久精品国产一区二区| 久久九九精品99国产精品| 久久精品综合一区二区三区| 久久亚洲精精品中文字幕| 久久国产精品免费| 国产精品久久久久影院色 | 青青青青久久精品国产| 久久亚洲AV无码精品色午夜 | 人妻精品久久无码区| 日韩va亚洲va欧美va久久| 久久99精品国产麻豆宅宅| 亚洲va中文字幕无码久久不卡| 久久99精品免费一区二区| 国产精品一久久香蕉国产线看观看| 色8激情欧美成人久久综合电| 国产精品久久成人影院| 亚洲色大成网站www久久九| 一级做a爰片久久毛片免费陪| 精品水蜜桃久久久久久久| 欧美日韩中文字幕久久伊人| 精品无码久久久久久午夜| 久久久久亚洲AV无码专区首JN | 久久精品不卡| 中文字幕成人精品久久不卡| 乱亲女H秽乱长久久久| 日韩AV无码久久一区二区| 久久精品国产色蜜蜜麻豆| 久久久久久久久久久精品尤物 | 色婷婷久久综合中文久久蜜桃av| 精品人妻伦九区久久AAA片69| 婷婷久久五月天| 囯产极品美女高潮无套久久久|