動態規劃 揹包問題

2021-08-16 17:41:18 字數 1120 閱讀 4508

//#define _crt_secure_no_warnings

#include #include #include #include "head.h"

using namespace std;

const int maxn = 100;

int dp[maxn][maxn];

int w[maxn];

int v[maxn];

void findv(int* x, int n, int c);

//dp[i][v]表示前i件物品放入容量為v的容器中最大價值

void bagproblem()

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

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

for (int i = 0; i <= m;i++)

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

else

}} cout <<"最大價值:" <1;i--)

else

}x[1] = j > 0 ? 1 : 0;

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

}int main()

動態規劃是一種用來解決一類最優化問題的演算法思想。簡單來說,動態規劃是將乙個複雜的問題分解成若干個子問題,通過綜合子問題的最優化解來得到原問題的最優解。需要注意的是,動態規劃會將每個求解過的子問題的解記錄下來,這樣當下一次碰到同樣的子問題時,就可以直接使用之前記錄的結果,而不是重複計算。注意:雖然動態規劃採用這種方式來提高計算效率,但不能說這種做法就是動態規劃的核心。

乙個問題必須擁有重疊子問題和最優子結構,才能使用動態規劃去解決。

分治與動態規劃:

分治和動態規劃都是將問題分解為子問題,然後合併子問題的解得到原問題的解。但是不同的是,分治法分解出的子問題是不重疊的,因此分治法解決的問題不擁有重疊子問題,而動態規劃解決的問題擁有重疊子問題。例如,歸併排序和快速排序都市分別處理左序列和右序列,然後將左右序列的結果合併,因此使用的是分治法。另外,分治法解決的問題不一定是最優化問題,而動態規劃解決的問題一定是最優化問題。

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...