揹包問題 01揹包

2021-07-31 06:02:34 字數 1195 閱讀 5279

有n件物品和乙個容量為v的揹包。第i件物品的重量是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。

01揹包中的「01」就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。

#include

#include

using

namespace std;

const

int maxn =

1000+10

;int w[maxn]

,c[maxn]

,dp[maxn]

[maxn]

;int n,k;

void

solve

(int w,

int c)

}printf

("%d\n"

,dp[n]

[k]);}

intmain()

solve()

;return0;

}

這個時間複雜度已經是最優了!是o(n*v),那麼空間複雜度是可以再進行優化的。

分析一下遞推的過程,第i件物品選取的最優解是由第i-1件物品最優解得到的,那麼我們完全可以把二維的陣列優化成一維陣列,使之成為滾動陣列這樣就要求我們每次在主迴圈中以j=v…0的順序推dp[j],這樣才能保證推dp[j]時dp[j-c[i]]儲存的是狀態dp[i-1][j-c[i]]的值

for i=1..n 

for j=v..0

dp[j]=max;

**如下:

#include

#include

using

namespace std;

const

int maxn =

1000+10

;int w[maxn]

,c[maxn]

,dp[maxn]

;int n,k;

void

solve

(int w,

int c)

}int

main()

printf

("%d"

,dp[k]);

return0;

}

好了,接下來就繼續揹包的系統整理啦!

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...

揹包問題 01揹包

b站課程有助於理解 對於揹包問題,有一種寫法,1.定義 是使用二維陣列,即dp i j 表示從下標為 0 i 的物品裡任意取,放進容量為j的揹包,價值總和最大是多少 2.確定遞推公式 再回顧一下dp i j 的含義 從下標為 0 i 的物品裡任意取,放進容量為j的揹包,價值總和最大是多少。那麼可以有...

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

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