有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 考...