Change Dir

          先知cd——熱愛生活是一切藝術(shù)的開始

          統(tǒng)計(jì)

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個(gè)公司技術(shù)

          我的鏈接

          淘寶技術(shù)

          閱讀排行榜

          評(píng)論排行榜

          深入理解動(dòng)態(tài)規(guī)劃的一系列問題(15)

          今天要說的 是0/1背包問題,問題非常經(jīng)典,即:給定一個(gè)袋子,容量為c,c∈N,同時(shí)有n個(gè)球A={a0,a1,…a(n-1)},每個(gè)球有一自己的價(jià)值v(ai),同時(shí)有一定的重量w(ai),目標(biāo)就是盡可能的裝球使得總價(jià)值最高,同時(shí)重量不能超出袋子的容量c。所以形式化表示這個(gè)問題即,對(duì)于Σwixi<=c,求最大max z=Σvixi。這個(gè)問題可以被看做一個(gè)多階段決策問題,對(duì)于每個(gè)ai,都要做決策xi來判斷是否要裝ai,階段標(biāo)示即n個(gè)物體A的下標(biāo),那么動(dòng)態(tài)規(guī)劃方程如下:f(i,w)= 0 if i=-1 and 0≤w≤c,f(i,w)=-∞ if i=-1 and w<0,f(i,w)=max {xivi+f(i-1,w-xiwi)} if i≥0。目標(biāo)自然是計(jì)算f(n-1,c)咯。其實(shí)現(xiàn)在理解01背包,典型的思路就是能階段性考慮,遞歸求解。不妨設(shè)c=22,n=3,v={25,24,15},w={18,15,10}。那么結(jié)論就是只選擇第一個(gè)球,最終切價(jià)值最高~~當(dāng)然這個(gè)例子可能特殊了點(diǎn),但是從公式上推理,我們知道這個(gè)遞歸方程是正確的。

          源碼如下:

             1: /*
             2:  * Copyright (C) 2013 changedi
             3:  *
             4:  * Licensed under the Apache License, Version 2.0 (the "License");
             5:  * you may not use this file except in compliance with the License.
             6:  * You may obtain a copy of the License at
             7:  *
             8:  * http://www.apache.org/licenses/LICENSE-2.0
             9:  *
            10:  * Unless required by applicable law or agreed to in writing, software
            11:  * distributed under the License is distributed on an "AS IS" BASIS,
            12:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
            13:  * See the License for the specific language governing permissions and
            14:  * limitations under the License.
            15:  */
            16: package com.jybat.dp;
            17:  
            18: import java.util.HashSet;
            19: import java.util.Set;
            20:  
            21: /**
            22:  * Knapsack01Problem.
            23:  * 
            24:  * @author zunyuan.jy
            25:  * 
            26:  * @since 2014年6月13日
            27:  */
            28: public class KS01 {
            29:  
            30:     private static int knapsackCapacity = 22;
            31:     private static int[] value = { 25, 24, 15 };
            32:     private static int[] weight = { 18, 15, 10 };
            33:     private static int n = value.length; // number of objects n=3
            34:     private static int highestIndex = n - 1; // items are indexed
            35:  
            36:     // from 0 through n-1
            37:  
            38:     private static Set<Integer> calculateDecisionSet(int objInd, int w) {
            39:         Set<Integer> decSet = new HashSet<Integer>();
            40:         decSet.add(new Integer(0)); // decision to not take object
            41:         // is always feasible
            42:         if (w >= weight[objInd]) { // check if there is enough space
            43:             // to take object
            44:             decSet.add(new Integer(1));
            45:         }
            46:         return decSet;
            47:     }
            48:  
            49:     public static double f(int currentObejctIndex, int weightToGive) {
            50:         if (currentObejctIndex == -1)
            51:             return 0.0;
            52:         Set<Integer> decisionSet = calculateDecisionSet(currentObejctIndex,
            53:                 weightToGive);
            54:         double max = 0.0;
            55:         for (int d : decisionSet) {
            56:             double tmp = d
            57:                     * value[currentObejctIndex]
            58:                     + f(currentObejctIndex - 1, weightToGive - d
            59:                             * weight[currentObejctIndex]);
            60:             if (tmp > max)
            61:                 max = tmp;
            62:         }
            63:         return max;
            64:     }
            65:  
            66:     /**
            67:      * @param args
            68:      */
            69:     public static void main(String[] args) {
            70:         System.out.println(KS01.f(2, 22));
            71:     }
            72:  
            73: }

          posted on 2014-06-16 13:02 changedi 閱讀(2495) 評(píng)論(6)  編輯  收藏 所屬分類: 算法

          評(píng)論

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問題(15) 2014-06-16 14:25 IT前線

          很想繼續(xù)看完,太難呀

          http://www.itqx.net  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問題(15) 2014-06-22 09:58 手賺網(wǎng)-手機(jī)賺錢軟件排行,手機(jī)賺錢平臺(tái),網(wǎng)絡(luò)賺錢http://www.szapk.cn

          輕松賺:http://www.szapk.cn/ruanjianzhongxin/30.html  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問題(15) 2014-06-27 17:22 e

          e  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問題(15) 2014-06-27 17:22 e

          真的可以評(píng)論啊  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問題(15)[未登錄] 2014-06-27 17:23 a

          真的可以評(píng)論啊啊啊!  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問題(15) 2014-07-15 02:29 自媒體

          有料  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 黎城县| 阳原县| 靖州| 桂林市| 周至县| 德阳市| 锡林郭勒盟| 万载县| 洪雅县| 阳曲县| 资源县| 文登市| 宣威市| 商南县| 石林| 武威市| 基隆市| 灵武市| 弥渡县| 通城县| 峡江县| 广宗县| 西林县| 原阳县| 南和县| 兴山县| 沭阳县| 林周县| 瓦房店市| 广丰县| 西昌市| 南平市| 历史| 桐庐县| 自贡市| 榕江县| 玉屏| 盘锦市| 太和县| 广昌县| 当阳市|