01揹包問題以及完全揹包問題

2021-10-03 16:42:44 字數 801 閱讀 3211

對於揹包問題。感覺揹包問題其實也是滾動陣列,就是看在揹包容量為v的情況下在前i個物品中獲得最大價值,一開始總看不懂,覺得每次取物品都只和前乙個i-1有關,怎麼去看全域性的物品。後面發現揹包容量v是關鍵,他是逆向遍歷,每取乙個物品i都把v從m到0都遍歷了個遍,然後在i+個物品的時候,裡面的v[i+1-w[i+1]]其實在上個物品i裡面就已經遍歷了,也就是說輪到第i+個物品的時候,v[i+1-w[i+1]]已經在第i個物品的時候就考慮到了,也就是可以用人人為我滾動陣列求解,這樣利用n^2的時間複雜度,就可以把題目解決。

**如下

#include

#include

#include

using

namespace std;

const

int maxn =

1e4;

int f[maxn]

;int w[maxn]

,val[maxn]

;void

solve

(int n,

int m)

}printf

("%d\n"

,f[m]);

}int

main()

return0;

}

現在想想,如果之前那行**變成正向遍歷會怎麼樣呢?

可能會把某乙個元素算多遍

而對於完全揹包問題,我們正需要將乙個物體算多遍,這巧妙的一點剛好能夠為我們省去n的時間複雜度

於是我們將之前那一行**改為

for(int v = 1;v <=m;v++)

就可以解決完全揹包問題了

01揹包 完全揹包以及相關問題

有n件物品和乙個容量為v的揹包。第i件物品的體積是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。從這個題目中可以看出,01揹包的特點就是 每種物品僅有一件,可以選擇放或不放。其狀態轉移方程為 f i v max 表示在揹包剩餘容量為v,面對第i個物品決策時,可以獲得的最大價值總和 p...

揹包問題(0 1揹包 完全揹包)

0 1揹包 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。重要的點在於 每種物品僅有一件,可以選擇放 不放子問題 f i v 表示前i件物品恰好放入乙個 容量為v 的揹包可以獲得的最大價值。狀態轉移方程 遞推式 f i v max 考...

01揹包問題 完全揹包問題 多重揹包問題

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...