03-動態(tài)規(guī)劃

動態(tài)規(guī)劃

動態(tài)規(guī)劃法的求解過程:

  1. 劃分子問題:將原問題分解為若干個子問題镀岛,每個子問題對應一個決策階段,并且子問題之間具有重疊關系衩侥。
  2. 確定動態(tài)規(guī)劃函數:根據子問題之間的重疊關系找到子問題滿足的遞推關系式(即動態(tài)規(guī)劃函數)茫藏,這是動態(tài)規(guī)劃法的關鍵民鼓。
  3. 填寫表格:設計表格薇芝,以自底向上的方式計算各個子問題的解并填表,實現動態(tài)規(guī)劃過程丰嘉。

動態(tài)規(guī)劃算法的基本要素為最優(yōu)子結構性質子問題重疊性質恩掷。

一個問題的最優(yōu)解包含其子問題的最優(yōu)解時,稱此問題具有最優(yōu)子結構性質供嚎,也稱此問題滿足最優(yōu)性原理黄娘。

子問題重疊性質是指在用遞歸算法自頂向下對問題進行求解時峭状,每次產生的子問題并不總是新問題,有些子問題會被重復計算多次逼争。

背包問題

背包問題是一種組合優(yōu)化的NP完全問題优床。問題可以描述為:給定一組物品,每種物品都有自己的重量和價格誓焦,在限定的總重量內胆敞,如何選擇,才能使得物品的總價格最高杂伟。

三種背包:

  1. 01背包:物品只可以取一次
  2. 完全背包:物品可以取無限次
  3. 多重背包:物品可以取的次數有一個上限

01背包:設V(n,C)表示將n個物品裝入容量為C的背包獲得的最大價值移层,顯然,初始子問題是把前面i個物品裝入容量為0的背包和把0個物品裝入容量為j的背包赫粥,得到的價值均為0观话,即:V(i,0)=V(0,j)=0V(i,j)在在決策x_i時越平,已確定了(x_1,...,x_{i-1})频蛔,則問題處于下列兩種狀態(tài)之一:

  1. 背包容量不足以裝入物品i,則裝入前i個物品得到的最大價值和裝入前i-1個物品得到的最大價值是相同的秦叛,即x_i=0晦溪,背包不增加價值。

  2. 背包容量可以裝入物品i挣跋,如果把第i個物品裝入背包三圆,則背包中物品的價值等于把前i-1個物品裝入容量為j-w_i的背包中的價值加上第i個物品的價值v;如果第i個物品沒有裝入背包避咆,則背包中物品的價值等于把前i-1個物品裝入容量為j的背包中所取得的價值舟肉。顯然,取二者中價值較大者作為把前i個物品裝入容量為j的背包中的最優(yōu)解牌借。則得到如下遞推式:
    V(i,j)= \left \{ \begin{array}\\ V(i-1,j) &j<w_i\\ max\{ V(i-1,j),V(i-1,j-w_{i})+Vi \} & j \ge w_i \end{array} \right.
    V(n,C)的值向前推度气,如果V(n,C)>V(n-1,C)割按,表明第n個物品被裝入背包膨报,前n-1個物品被裝入容量為C-w_n的背包中。

import java.util.Arrays;

public class DynamicProgramming {
    // 動態(tài)規(guī)劃解決01背包
    public static int knapsack01(int[] weight, int[] value, int n, int capacity) {
        // 表格的行代表物品适荣,列代表容量
        int[][] table = new int[n + 1][capacity + 1];
        // 初始化表格的第0列
        for (int c = 0; c <= n; c++)
            table[c][0] = 0;
        // 初始化表格的第0行
        for (int r = 0; r <= capacity; r++)
            table[0][r] = 0;
        // 填寫表格
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= capacity; j++)
                if (j < weight[i]) // 此時的容量j现柠,裝不下物品i
                    // 此時價值為上一行這個容量時的價值
                    table[i][j] = table[i - 1][j];
                else // 此時的容量j,能裝下物品i
                    table[i][j] = Math.max(table[i - 1][j], table[i - 1][j - weight[i]] + value[i]);
        }
        // 裝入背包的物品:0未裝入弛矛,1裝入
        int[] loaded = new int[n + 1];
        for (int i = n, j = capacity; i > 0; i--)
            if (table[i][j] > table[i - 1][j]) {
                loaded[i] = 1;
                j = j - weight[i];
            } else {
                loaded[i] = 0;
            }
        System.out.println(Arrays.toString(loaded));
        return table[n][capacity];
    }

    public static void main(String[] args) {
        // 商品編號從1開始
        int[] weight = {0, 2, 12, 1, 1, 4};
        int[] value = {0, 2, 4, 2, 1, 10};
        // 物品數量
        int n = weight.length - 1;
        int capacity = 15;
        // [0, 1, 0, 1, 1, 1]
        // 15
        System.out.println(knapsack01(weight, value, n, capacity));
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末够吩,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子丈氓,更是在濱河造成了極大的恐慌周循,老刑警劉巖强法,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異湾笛,居然都是意外死亡饮怯,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門嚎研,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓖墅,“玉大人,你說我怎么就攤上這事临扮÷鄯” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵杆勇,是天一觀的道長贪壳。 經常有香客問我,道長靶橱,這世上最難降的妖魔是什么寥袭? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮关霸,結果婚禮上传黄,老公的妹妹穿的比我還像新娘。我一直安慰自己队寇,他們只是感情好膘掰,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佳遣,像睡著了一般识埋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上零渐,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天窒舟,我揣著相機與錄音,去河邊找鬼诵盼。 笑死惠豺,一個胖子當著我的面吹牛,可吹牛的內容都是我干的风宁。 我是一名探鬼主播洁墙,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戒财!你這毒婦竟也來了热监?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤饮寞,失蹤者是張志新(化名)和其女友劉穎孝扛,沒想到半個月后列吼,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡苦始,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年冈欢,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盈简。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凑耻,死狀恐怖,靈堂內的尸體忽然破棺而出柠贤,到底是詐尸還是另有隱情香浩,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布臼勉,位于F島的核電站邻吭,受9級特大地震影響,放射性物質發(fā)生泄漏宴霸。R本人自食惡果不足惜囱晴,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓢谢。 院中可真熱鬧畸写,春花似錦、人聲如沸氓扛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽采郎。三九已至千所,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒜埋,已是汗流浹背淫痰。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留整份,地道東北人待错。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像皂林,于是被迫代替她去往敵國和親朗鸠。 傳聞我的和親對象是個殘疾皇子蚯撩,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容