動態規劃問題

2021-06-21 22:09:21 字數 2374 閱讀 6132

思想:

如果乙個問題是由交疊的子問題所構成,那麼我們就可以用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞迴關係中。這個遞推關係包含了相

同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中。

例題:0-1揹包問題

問題描述:

給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?

對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1.我們設物品i的裝入狀態為xi,xi∈ (0,1),此問題稱為0-11揹包問題。

過程分析(通過乙個例子

):資料:物品個數n=5,物品重量w[n]=,物品價值v[n]=,

(第0位,置為0,不參與計算,只是便於與後面的下標進行統一,無特別用處,也可不這麼處理。)總重量c=10.

揹包的最大容量為10,那麼在設定陣列m大小時,可以設行列值為6和11,那麼,對於m(i,j)就表示可選物品為i…n揹包容量為j(總重量)時揹包中所放物品的最大價值。

下面是自己寫的**:

#include#include#define max(x, y) x > y ? x : y 

void calaccount(int minnum, int** account, int num, int* weight, int *value, int maxweight);

void getaccount(int** account, int num, int* weight, int *value, int maxweight);

void printaccount(int **account, int num, int maxweight);

void search(int **account, int maxweight, int num, int *weight);

int main()

void calaccount(int minnum, int** account, int num, int* weight, int *value, int maxweight)//計算一行

else if(weight[minnum] > maxweight) else

account[minnum][maxweight] = max((account[minnum+1][maxweight]),(account[minnum+1][maxweight-weight[minnum]] + value[minnum])); }}

void getaccount(int** account, int num, int* weight, int *value, int maxweight) //驅動程式

void printaccount(int **account, int num, int maxweight) //列印矩陣

}void search(int **account, int maxweight, int num, int *weight) //輸出最佳組合

i++;

} if(account[i][maxweight] != 0)

printf("%d", i);

printf("\n");

}

動態規劃問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量v,n v同時為0時結束測試,...

動態規劃問題

以下內容基於個人理解。一 什麼是動態規劃 動態規劃 dp 演算法,指的是 乙個問題的解決是依賴於若干個和該問題相似,但比該問題的問題規模更小的問題時,所採用的一種演算法。動態規劃是自底向上的思考問題的方法,通常要從最底層的問題開始考慮。而這類問題的特點是 解決所有本層次問題後,就可以解決上一層的問題...

動態規劃問題

連續自陣列的最大和問題,要求時間複雜度o n bool g invalidinput false int greatestsumofsubarray int array,int length int currentsum 0 int greatestsum 0x80000000 for int i ...