動態規劃法解決0 1揹包問題 C

2021-07-07 05:17:53 字數 1195 閱讀 4168

1.動態規劃法的設計思想:動態規劃法將待求解問題分解成若干個相互重疊的子問題,每個子問題對應決策過程的乙個階段,子問題的重疊關係一般表現在對給定問題求解的遞推關係,將子問題的的解求解一次並且填入表中,當需要再次求解子問題的時候,可以通過查表獲得這個子問題的解而不是再次求解,從而避免大量重複計算,為了達到這個目的,可以通過乙個表來記錄所有以解決的子問題的解。

2.動態規劃法求解的問題的特徵:該問題的最優解中包含著子問題的最優解(符合最優性原理),能夠分解為相互重疊的若干個子問題、

3.動態規劃法的步驟:

(1)分段:將原問題分成若干個相互重疊的子問題

(2)分析:分分析問題是否滿足最優性原理,找出動態規劃函式的遞推式

(3)求解:利用遞推式自底向上計算,實現動態規劃的過程

根據這個套路 我們來看0-1揹包問題,0-1揹包問題的動態規劃函式是

v(i,j): 當揹包容量為j的時候,他的最大

w[i]:第i個物品的質量

v[i]:第i個物品的價值

動態規劃函式為:

下面是程式:

#include 

using

namespace

std;

//比較兩個數的大小,返回較大的數

int max(int a,int b)

//01揹包動態規劃演算法

int knapsack(int c, int n, int w, int v)

for(int j = 0; j <= c; j++)

//計算第i行,進行第i次迭代

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

}//裝入的物品

int x[n];

int j = c;

cout

<

for(int i = n ; i >= 0; i--)

else

x[i] = 0;

cout

}cout

}int main()

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

cout

<< "the max value is :"

<< knapsack(c,n,w,v)<

}

0 1揹包問題 動態規劃法

問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...

0 1揹包問題 動態規劃法

問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...

動態規劃法 01揹包問題

一 幾個概念 最優化問題 有 n個輸入。它的解由這 n個輸入的乙個子集組成,這個子集必須滿足某些事先給定的條件。這些條件稱為約束條件。滿足約束條件的解稱為問題的可行解。滿足約束條件的可行解可能不止乙個,為了衡量這些可行解的優劣,事先給出一定的標準,這些標準通常以函式的形式給出。這些標準函式稱為目標函...