動態規劃 揹包問題

2021-10-23 20:52:34 字數 1806 閱讀 4069

n件物品 揹包最大重量w,

每個物品都有value和w

每個物品都只能取一次,

重量不超過w的情況下

求價值最大。

0[i]

[j] 表示在j的重量下此時,只考慮前i個物品的最大價值

此時倆種情況:

1.不算i物品,此時f[i]

[j]= f[i-1]

[j];即上一行時(不包括第i個物品的最大價值)

2.計算i物品:f[i]

[j]= f[i-1]

[j-w[i]

]+value[i]

;即:將減去i物品的重量時的最大價值+ i物品的價值

將兩種情況對比,取最大的值賦給f[i]

[j]

#include

#include

#include

#include

using

namespace std;

intconst n =

1010

;int f[n]

[n];

// f[i][j] i代表物品,j代表重量,表示在j重量下i個物品所能達到的最大價值

int m,n;

intmain()

}}int res =0;

for(

int i =

1;i<=n;i++

) res=

max(res,f[i]

[m])

; cout<}

此時演算法的時間複雜度為o(n2),一般測試平台每秒執行107次或者108

優化演算法:

將二維陣列變為一維陣列

#include

#include

#include

#include

using

namespace std;

intconst n =

1010

;int f[n]

;// f[i] 表示在i重量下個物品所能達到的最大價值

int m,n;

intmain()

}int res =f[m]

; cout<}

跟0-1揹包不同,此時物體i可以取無限次

/*

f[i] 表示總重量為i的情況下,最大價值多少

在0-1揹包問題下,從大到小排表示在沒有取i的情況下,此時的最大價值就是上乙個物品的最大價值,即i取0次

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

for(int j =m;j>=v[i];j--)

f[j]= max(f[j],f[j-v[i]]);

因此完全揹包問題只需要將排序改變就變成了取無數次後的結果,因為這就是取反的效果

result = max(f[0.....m])

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

for(int j =v[i]; j<=m;j++)

f[j]= max(f[j],f[j-w[i]]+value[i]);

*/

此時**為:

#include

#include

#include

using

namespace std;

const

int n=

1010

;int f[n]

;int m,n;

int w[n]

,value[n]

;int

main()

cout<<}

動態規劃 揹包問題

給定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 元。於是,他把每...