• <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 閱讀(441) 評論(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年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            統計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            97久久精品人妻人人搡人人玩| 免费无码国产欧美久久18| 国产美女久久久| 国产精品一区二区久久精品无码| 99久久精品国产一区二区蜜芽| 午夜视频久久久久一区| 久久久无码一区二区三区| 国产毛片久久久久久国产毛片 | 久久免费大片| 综合人妻久久一区二区精品| 久久久久免费精品国产| 狠狠色丁香久久婷婷综合蜜芽五月 | 欧美激情精品久久久久| 亚洲精品成人网久久久久久| 久久天堂AV综合合色蜜桃网| 久久久久综合国产欧美一区二区| 日韩精品久久久久久久电影蜜臀| 国产高潮国产高潮久久久91| 亚洲国产美女精品久久久久∴| 精品久久久久久国产免费了| 久久夜色精品国产网站| 亚洲一区精品伊人久久伊人| 色综合久久综精品| 97r久久精品国产99国产精| 久久精品国产乱子伦| 日日狠狠久久偷偷色综合0| 99久久国产综合精品麻豆| 狠狠色婷婷久久综合频道日韩 | 久久久久久久91精品免费观看| 国产精品一久久香蕉产线看| 精品国产乱码久久久久久呢| 一97日本道伊人久久综合影院| 久久av免费天堂小草播放| 精品久久一区二区| 99精品久久久久中文字幕| 久久棈精品久久久久久噜噜| 久久免费的精品国产V∧| jizzjizz国产精品久久| 精品久久久久中文字幕日本| 91久久精品91久久性色| 亚洲伊人久久大香线蕉苏妲己|