動態規劃法解

2022-11-23 06:33:02 字數 1615 閱讀 1846

2011級3班張思源

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

動態規劃採用由下至上計算策略。

一、問題描述與分析

動態規劃法解0-1揹包問題:某商店有n個物品,第i個物品價值為vi,重量(或稱權值)為wi,其中vi和wi為非負數,揹包的容量為w(w為一非負數)。目標是如何選擇裝入揹包的物品,使裝入揹包的物品總價值最大,所選商品的乙個可行解即所選商品的序列如何揹包問題與0-1 揹包問題的不同點在於,在選擇物品裝入揹包時,可以只選擇物品的一部分,而不一定要選擇物品的全部。

二、演算法設計(演算法步驟)

設0/1揹包問題的最優值為m( i, j ),即揹包容量是j,可選擇物品為i,i+1,…,n時0/1揹包問題的最優值。由0/1揹包問題的最優子結構性質,可以建立計算m( i, j )的遞迴式如下:

maxm( i, j )=

m(i+1,j)

m(n,j)=

0三、演算法實現

程式源**:

#include <>

#include<>

#include<>

#include<>

#include<>

int min(int w, int c)

int max(int w, int c)

void knapsack(int v, int w, int** m, int c, int n) //求最優值

int traceback(int x, int w, int** m, int c, int n) //回代,求最優解

int main()

int n, c;

int **m;

cout <<0-1揹包問題程式<< endl;

cout << "請輸入物品個數: ";

cin >> n ;

cout << endl << "請輸入揹包的承重:";

cin >> c;

int *v = new int[n+1];

cout << endl << "請輸入每個物品的價值 (v[i]): " << endl;

for(int i = 1; i <= n; i++)

cin >> v[i];

int *w = new int[n+1];

cout << endl << "請輸入每個物品的重量 (w[i]): " << endl;

for(int j = 1; j <= n; j++)

cin >> w[j];

int *x = new int[n+1];

m = new int* [n+1動態的分配二維陣列

for(int p = 0; p < n+1; p++)

m[p] = new int[c+1];

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

traceback(x, w, m, c, n);

system("pause");

}程式執行截圖:

四、演算法分析與改進

揹包問題的動態規劃法

揹包問題 在m件物品取出若干件放在空間為w的揹包裡,每件物品的重量為w1,w 2 wn,與之相對應的價值為p1,p2 pn。求出獲得最大價值的方案。注意 在本題中,所有的重量值均為整數。演算法分析 對於揹包問題,通常的處理方法是搜尋。用遞迴來完成搜尋,演算法設計如下 function make i ...

最大欄位和問題動態規劃法

淮海工學院計算機工程學院 實驗報告書 課程名 演算法分析與設計 題目 實驗2 動態規劃演算法 最大子段和問題 班級軟體081班 學號110831116 姓名陳點點 實驗2 動態規劃演算法 實驗目的和要求 1 深刻掌握動態規劃法的設計思想並能熟練運用 2 理解這樣乙個觀點 同樣的問題可以用不同的方法解...

備忘錄方法 動態規劃法的變形

求lcs的問題。當xi yj時,求c i,j 只需知道c i 1,j 1 而無需用到c i,0 c i,j 1 及c i 1,j c i 1,n 當只需求出乙個lcs時,可能有一些c p,q 在整個求解過程中都不會用到。一般地,當某個問題可以用動態規劃法求解,但二維陣列中有相當一部分元素在整個計算中...