動態規劃演算法入門

2021-08-21 15:22:44 字數 1706 閱讀 3717

一、問題

公司現在有8個任務,任務1-8的薪水分別是:5、1、8、4、6、3、2、4,有些任務之間是有時間衝突的,比如選了任務8就不能選任務6和7,而選了任務5就不能選任務1、2、3、4、6、7。如圖,橫軸代表時間,灰色矩形代表每個任務,矩形開始和結束的橫座標分別對應每個任務的開始和結束時間,紅色數字代表薪水。比如任務1開始時間是1,結束時間是4,持續了(4-1)即3小時,薪水為5。現在的問題是,如何在0-11點之間,從這8個任務中選擇時間互不衝突的若干個任務,使得得到的總薪水最大。

二、分析最優子結構、重疊子問題

用opt(i)代表考慮第1至第i個任務時的最優解,比如opt(5)代表考慮前5個任務的最優解,opt(8)代表考慮前8個任務的最優解,考慮這個問題最關鍵的就是,分析每個任務選和不選的兩種情況。現在由上圖可知,選了任務8就不能選任務6和7,而任務8也可以不選,所以,當考慮opt(8)時我們要考慮:

(1)如果選了任務8,任務6和7就不能選,那麼只要再考慮前5個任務的最優解,即opt(5);

(2)如果不選任務8,那只要考慮前7個任務的最優解,即opt(7),就可以了;

(3)最後,我們比較上面兩種情況得到的薪水,由薪水大小決定究竟選不選任務8

故opt(8)=max,這裡的4是指任務8的薪水,由上圖可知是4

最後推出遞迴式:

上式,opt(i)代表考慮前i個任務的最優解(1≤i≤8),vi代表第i個任務的薪水,prev(i)是乙個陣列,標記如果選擇了第i個任務,則剩餘只要考慮前幾個任務就可以了,比如prev(8)=5,如果選了第8個任務,只要考慮前5個就可以了;prev(6)=2,如果選了第6個任務,只要考慮前2個就可以了;

根據這個問題,我們可以得到vi表:

v1v2

v3v4

v5v6

v7v851

8463

24prev(i)表:

prev(1)

prev(2)

prev(3)

prev(4)

prev(5)

prev(6)

prev(7)

prev(8)00

0102

35最終由遞推式計算得到opt(i)表,注意初始時opt(0)=0,而opt(8)就是我們要的最終解:

opt(0)

opt(1)

opt(2)

opt(3)

opt(4)

opt(5)

opt(6)

opt(7)

opt(8)05

5899

91013上表中,比如opt(3)代表如果只考慮前3個任務能得到的最大薪水,由於

opt(3)=max

而opt(0)+8=8,opt(2)已經計算好,為5,那麼opt(0)+8 > opt(2),(注:

opt(2)是怎麼來的: 計算opt(2)=max 得到 opt(0)+1 < opt(1)

由於opt(1)大所以要考慮opt(1)是怎麼來的: opt(1)=max=opt(0)+5=5

可見如果只考慮前3個任務,我們選做任務集合為時,就能得到最大薪水,為8

其他以此類推。

所以,最終能得到的最大薪水為opt(8)=13。

動態規劃演算法入門

package com.huawei.interview2 動態規劃 入門級 題目 只有1元,3元,5元硬幣,如何用最少的硬幣湊夠11元。public class test7 param money 要用硬幣拼湊的錢數 return private static int getcoinsnum in...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...