動態規劃(2)

2021-09-29 02:23:00 字數 1249 閱讀 4562

4.5 0-1揹包問題

給定乙個物品集合s={1,2,3,…,n},物品i的重量是wi,其價值是vi,揹包的容量為w,即最大載重量不超過w。在限定的總重量w內,我們如何選擇物品,才能使得物品的總價值最大。

如果物品不能被分割,即物品i要麼整個地選取,要麼不選取;

不能將物品i裝入揹包多次,也不能只裝入部分物品i,則該問題稱為0-1揹包問題。

如果物品可以拆分,則問題稱為揹包問題,適合使用貪心演算法。

階段:i~n ,依次處理每一件物品

狀態:揹包的容量:0~v

決策:在第i階段,在揹包容量是v 的情況下,如何處理第i 件物品,才能使裝入揹包中的物品最大。

f[i][v]表示前i件物品(部分或全部)放入乙個容量為v的揹包可以獲得的最大價值。

處理方案:在w[i]>v的情況下,不裝入;否則,根據

max進行決策

狀態轉移方程便是:

f[i][v]=max。

#include

using namespace std;

const int maxm = 201, maxn = 31;

int m, n; int w[maxn], c[maxn]; int f[maxn][maxm];

int max(int x,int y) //求x和y最大值

int main()

4.6 最長單調遞增子串行

設計乙個o(n2)時間的演算法, 找出由n個數組成的序列的最長單調遞增子串行。

輸入: 第1個整數n(0=a[k],並且 b[k]=max(b[ j]), 1<=j<=i-1

所以:b[i]=b[k]+1.

如果存在k』, b[k』]>b[k] ,並且 a[i]>=a[k』],即

b[i]不是滿足條件的最大值。這與定義矛盾。

因此, 該問題滿足最優子結構性質。

用陣列b[0:i]記錄以a[i] (0≤i即k在0~(i-1)範圍內, 若a[k] ≤a[i], 尋找最大的b[k].

據此將計算b[i]轉化為i個規模更小的子問題。

#define num 100

int a[num];      //序列l

int lis_n2(int n)  ;   //輔助陣列b

int i,j;

b[1] = 1; //以a[1]結尾的子串行中只包含乙個元素

int max = 0;     //陣列b的最大值

for (i=2;i<=n; i++)

return max;

}

動態規劃2

動態規劃是研究一類最優化問題的方法,在經濟 工程技術 企業管理 工農業生產及軍事等領域中都有廣泛的應用。近年來,在acm icpc中,使用動態規劃 或部分應用動態規劃思維 求解的題不僅常見,而且形式也多種多樣。而在與此相近的各類資訊學競賽中,應用動態規劃解題已經成為一種趨勢,這和動態規劃的優勢不無關...

動態規劃(2)

題目輸入格式 第1行 兩個數字r,c 1 r,c 100 表示矩陣的行列。第2.r 1行 每行c個數,表示這個矩陣。輸出格式 僅一行 輸出1個整數,表示可以滑行的最大長度。樣例輸入 5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 ...

動態規劃2

最長遞增子串行的問題 給定陣列arr,返回arr的最長遞增子串行長度。比如arr 最長遞增子串行為,返回arr的最長遞增子串行長度。比如arr 最長遞增子串行為所以返回這個子串行的長度為5。解決方案 arr 2 1 5 3 6 4 8 9 7 dp 1 1 2 2 3 3 4 5 4 dp i 表示...