• <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>

            單鏈DNA

            換了個地址:http://www.cnblogs.com/vizhen/

             

            0-1背包問題--動態規劃解法


             問題描述:
                  給定n種物品和一背包,物品i的重量是wi,其價值為vi,背包的容量為C。問應如何選擇裝入背包的物品(物品不能分割),使得裝入背包中物品的總價值最大?

             抽象描述如下:
                 x[n]:表示物品的選擇,x[i]=1表示選擇放進物品i到背包中。
                     
             
             問題分析:
                     1.抽象之后背包問題轉換為找到一個最優的數組,x1,x2,.....,xn的0-1序列。
                    
                     2.假設最優解的序列為x1,x2,.....,xn,能使背包容量C的總價值最大.

                           如果,x1=1,則x2,...,xn是C-w1容量的背包的總價值依然是最大的序列;
                           如果,x1=0,則x2,....,xn是C容量的背包的總價值依然是最大的序列。
                       這就是我們所說的最優子結構性質。
                    
                     3.進一步分析:我們用m(i,j)表示為已經判斷好了i:n的序列的背包最大價值,并且此時的背包剩余的容量為j,對物品i進行判斷

                            如果j>wi, 就只要做出選擇wi和不選擇wi情況下,哪種更能使背包的總價值更大:m(i,j)=max{ m(i+1,j),m(i+1,j-wi)+vi}(注意這是個遞歸式)
                            如果j<wi:       m(i,j)=m(i+1,j)
                            初始化:        m(n,j)=vn  (j>= wn);
                                            m(n,j)=0   (0<=j< wn)
                                            m(0,C)=0   
                         最終的結果:m(1,C)

                    4.依次我們就得到了一個遞歸的表達式:
                           
                  
                   5.如果單純的從利用遞歸,重復計算了很多的值,耗費的時間是很大的,動態規劃還需避免這種重復計算,怎樣自頂向下或自底向上的計算呢?

                      采用列表的方法就可以很好的分析設計自頂向下或自底向上的計算的算法了

             舉例分析:
                     n=3,c=6,w={4,3,2} v={5,2,1}
                     m[i][j]=max{ m[i+1][j], m[i+1][j-w[i]]+v[i] }
                     列表如下:
                     

                      最左邊箭頭:我們計算的方向,從第3行開始向上計算法值。
                      表中紅色箭頭是我們通過選擇做出的結果:列如 m[2][3]=max{m[3][3],m[3][3-w[2]]+v[2]},我們最終選擇了m[3][3-w[2]]+v[2]。
                      整個問題的最優解保存在m[1][6]中。

             代碼實現:
                 
            //w[]:保存物品重量
            //v[]:保存物品價值
            //n:物品數目 c:背包容量
            //#define max(a,b) (((a) > (b)) ? (a) : (b))
            int KnapsackDP(int n,int c)
            {
                
            int i,j;
                
            //初始化
                for (j=0;j<=c;j++)
                {
                    
            if (j>=w[n])
                   m[n][j]
            =v[n];
                    
            else
                   m[n][j]
            =0;
                }
               

                for
             (i=n-1;i>=0;i--)
                {
                   
            for (j=0;j<=c;j++)
                   {
                      
            if (j>=w[i])
                          m[i][j]
            =max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
                      
            else 
                         m[i][j]
            =m[i+1][j];
                    }
                 }
               
              
            return m[1][c];

            }

            //構造選擇序列x[],x[i]=1表示選擇i號物品放到背包中,則x[i]=0表示不選擇
            void Creatx(int x[])
            {
                for (i=1;i<n;i++)
                 {
                    if (m[i][c]==m[i+1][c])
                    {
                        x[i]=0;
                    }
                    else
                    {
                        x[i]=1;
                        c-=w[i];
                    }
                }
                x[n]=m[n][c]?1:0;//m[n][C]==0則表示為沒有選擇第n號物品
             
            }


            實戰:
              HDOJ 2602  http://acm.hdu.edu.cn/showproblem.php?pid=2602
                 


            posted on 2009-12-02 16:11 Geek.tan 閱讀(3741) 評論(0)  編輯 收藏 引用 所屬分類: 算法學習

            導航

            統計

            公告

            coding是我的寂寞,我是誰的寂寞

            隨筆分類(40)

            隨筆檔案(48)

            搜索

            積分與排名

            最新評論

            評論排行榜

            久久精品国产一区| 国产精品成人精品久久久| 色综合久久天天综线观看| 久久夜色精品国产亚洲av| 精品久久久久成人码免费动漫 | 久久久精品2019免费观看| 久久婷婷五月综合97色| 久久精品国产亚洲沈樵| 性做久久久久久久久久久| 久久久久99精品成人片欧美| 久久国产免费直播| 免费久久人人爽人人爽av| 国产精品久久国产精麻豆99网站| 久久精品国产亚洲精品| 久久水蜜桃亚洲av无码精品麻豆 | 伊人丁香狠狠色综合久久| 欧美久久久久久精选9999| 97精品伊人久久久大香线蕉 | www.久久热| 国产精品99久久久精品无码 | 久久亚洲国产成人影院| 国产精品伊人久久伊人电影| 亚洲中文精品久久久久久不卡| 国产免费福利体检区久久| 精品久久久久久久无码| 伊人久久无码精品中文字幕| 久久综合九色综合久99| 久久青青草原精品国产| 99精品久久精品一区二区| 亚洲第一永久AV网站久久精品男人的天堂AV | 国产精品99久久久精品无码| 久久中文字幕视频、最近更新| 久久国产精品一区二区| 久久精品国产亚洲AV无码偷窥 | 久久久黄片| 久久久久亚洲精品天堂久久久久久 | 久久久www免费人成精品| 久久久久国产日韩精品网站| 久久精品国产99国产电影网| 97精品久久天干天天天按摩| 精品国产VA久久久久久久冰 |