揹包問題之01揹包問題

2021-08-05 18:27:01 字數 2595 閱讀 9637

題目:

有n件物品和乙個容量為v的揹包。第i件物品的容量是c[i],價值為w[i]。

求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。

基本思路:

作為最基礎的揹包問題,特點是:每種物品只有一件,可以選擇放或者是不放。

用子問題定義狀態:f[i][v]表示前i件物品恰好放入乙個容量為v的揹包可以獲得的最大價值。則狀態轉移方程為:f[i][v]=max。

狀態方程可解釋如下:

「將前i件物品放入容量為v的揹包中」這個問題,如果只是考慮第i件物品的話,那麼只有兩種狀態,放或者不放,那麼這個問題實際上可以轉化為只關係到前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為v的揹包中」;如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的容量為v-c[i]的揹包中」,此時能夠獲得的最大價值就是f[i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。

f[i][v]有意義當且僅當存在乙個前i件物品的子集,其費用總和為v。所以按照這個方程遞推完畢後,最終的答案並不一定是f[n][v],而是f[n][0...v]的最大值。

如果將狀態的定義中的「恰」字去掉,在轉移方程中就要再加入一項f[i][v-1],這樣就可以保證f[n][v]就是最後的答案。((o_o)?這個不是特別明白......等我回來明白了再說吧!。。。)

優化空間複雜度:

以上方法的時間和空間複雜度均為o(n*v),其中時間複雜度已經不能夠再繼續優化啦,但是空間複雜度可以繼續優化,直至o(v)。

以上的基本思路的實現:

首先要有乙個主迴圈i=1...n,接下來算出f[i][0...v]的所有值。

如果只用一維陣列的話,f[0...v],這就要求我們在每一次主迴圈中以i=v...0的順序推f[v],因為只有這個樣子才可以保證推f[v]的時候f[v-c[i]]儲存的是狀態f[v-c[i]]儲存的狀態時f[i-1][v-c[i]]的值。

偽**如下:

for i=1...n

for j=v...0

f[j]=max;

其中的f[j]=max就相當於我們的轉移方程f[i][v]=max,因為現在的f[v-c[i]]就相當於f[i-1][v-c[i]]。

hdu 2602 bone collector

分析:

本題。。。就是01揹包問題的板子題。。。。。。作為最基礎問題,小試牛刀下吧~

**如下:

#include#includeusing namespace std;

#define maxn 1100

int t,n,v;

int values[maxn];

int weight[maxn];

int f[maxn];

int main()

}cout<

hdu 2191 悼念512汶川大**遇難同胞——珍惜現在,感恩生活

分析:題目是沉重的,題意是顯然的。

本題也是01揹包問題的板子題。。。。。。**就不掛啦~

珍惜現在,感恩生活,熱愛生命!

hdu 2456 飯卡

分析:

這道題應該可以稱得上是典型的01揹包問題了吧,每樣菜只能買一次嘛。(題目的邏輯是不是有問題......那個「所以大家都希望盡量使卡上的餘額最少。」的「所以」是不是用錯了......)

因為想讓卡上的餘額最小,又因為當卡上的餘額大於等於五的時候,買啥都行,所以說可以先預先留下5塊錢,用來買最貴的那個東西,這樣對於其他東西和餘下的錢來說,就真的構成了01揹包問題。

**如下:

#include#include#includeusing namespace std;

#define maxn 1010

int n,m;

int price[maxn];

int f[maxn];

int ans;

int main()

cout<

揹包問題之01揹包

01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...

揹包問題之0 1揹包

0 1揹包是最基本的揹包問題,其核心思路就在於每個物品的放與不放 每個物品最多只能放一次 題目有 n 個物品和乙個大小為 m 的揹包.給定陣列 a 表示每個物品的大小和陣列 v 表示每個物品的價值.問最多能裝入揹包的總價值是多大?樣例輸入 m 10,a 2,3,5,7 v 1,5,2,4 輸出 9 ...

揹包問題之0 1揹包

揹包問題大部分是這樣的 有乙個容量為v的揹包和一些物品。這些物品有兩個屬性,體積 和價值 每種物品只有乙個。要求用這個揹包裝下價值盡可能多的物品,求其最大價值。因為在最優解中,每個物品都有兩種可能的情況,即在揹包中存在 或者不存在 揹包中有0個或者1個該物品 因而被稱為0 1揹包問題。採藥 辰辰是個...