演算法實驗3《動態規劃演算法實驗》

2021-08-13 21:41:48 字數 1645 閱讀 7978

1. 編寫乙個簡單的程式,解決0-1揹包問題。設n=5,c=10,w=,v= 

#include

using

namespace std;

void

knapsack

(int

*v,int

*w,int c,

int n,

int**m)

m[1][c]

= m[

2][c];

if(c >= w[

1])m[

1][c]

=(m[

1][c]

> m[

2][c - w[1]]

+ v[1])

? m[

1][c]

: m[

2][c - w[1]]

+ v[1];

}int

main();

int v[6]

=;int**m =

newint*[6

];for

(int i =

0; i <

6; i++)m[i]

=new

int[6];

knapsack

(v, w, c, n, m);

cout <<

" 最優值為 "

<< m[

1][c]

<<"\n

最優解為取第 "

;for

(int i =

1; i < n; i++)}if

(m[n][c])cout << n;

cout <<

" 個物品"

;system

("pause>nul"

);return0;

}

2. 合唱隊形安排問題

【問題描述】n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2…,k,他們的身高分別為t1,t2,…,tk,  則他們的身高滿足t1<...ti+1>…>tk(1<=i<=k)。已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。

#include

using

namespace std;

//計算以list[i]為結尾的遞增陣列的最大長度length[i]

void

getlength

(int n,

double

*list,

int*length)

}void

change

(double

*list,

int n)

//把陣列反過來

}int

main()}

cout <<

"合唱隊形最大長度為"

<< lengthmax-1

<<"\n

最高者是第"

<"個,高"

<< list[index+1

];system

("pause>nul"

);return0;

}

實驗三 動態規劃演算法

一 實驗目的 通過動態規劃演算法的示例程式理解動態規劃演算法的基本思想 運用動態規劃演算法解決實際問題加深對動態規劃演算法的理解和運用 二 實驗環境 vc 6.0 三 實驗內容 1.源 如下 include include include include using namespace std de...

實驗六( 動態規劃演算法)

通過動態規劃演算法的示例程式理解動態規劃演算法的基本思想 運用動態規劃演算法解決實際問題加深對動態規劃演算法的理解和運用 visual studio 2013 寫出主要的內容 最長公共子串行問題 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj ...

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...