01揹包的c語言實現
01揹包算是動態規劃的入門專案了,網上的解釋也是各種爛大街。題目基本是下面這種格式的:
01揹包是在M件物品取出若干件放在空間為W的揹包裡,每件物品的體積為W1,W2……Wn,與之相對應的價值為P1,P2……Pn。(來自百度百科)
恩,就是這樣,第一眼看上去完全沒有頭緒,不過別害怕,這絕對不是你見到的第一個DP問題。生活中的每一個問題都有動態規劃融入其中,你能活到現在,說明你有能力處理好這些問題。
現在我們來想一想,生活中如何解決這種問題。我們假設揹包有W + 1個狀態(0,1,2,...,W)。狀態從0開始,每次放入新的物品揹包的總價值都會增大,可放物體的體積都會縮小,到這裡大家都應該沒有問題吧。
然後我們再考慮“將前i件物品放入容量為v的揹包中”這個子問題,如果只考慮放不放第i件物品,那麼這個問題就可以轉化為一個只牽扯前i-1件物品的問題:
如果不放第i件物品,那麼問題就轉化為“前i-1件物品放入容量為v的揹包中”,價值為f[v];
如果放第i件物品,那麼問題就轉化為“前i-1件物品放入剩下的容量為v-c的揹包中”,此時能獲得的最大價值就是f[v-c]。
再加上通過放入第i件物品獲得的價值 W[i],我們就可以從後向前地得出在前M件物品中取出若干件放進揹包能獲得的最大價值了。
下面是用C語言實現的程式碼:
#include <iostream> using namespace std; int main() { int V,N; int i,j; int c[N]; int w[N]; cin >> V >> N; for(i = 1;i <= N;i++) { cin >> c[i] >> w[i]; } int F[10010] = {}; for(i = 1;i <= N;i++) { for(j = V;j >= c[i];j--) { F[j] = max(F[j],F[j - c[i]] + w[i]); } } cout << F[V]; return 0; }
程式碼整體算是比較簡潔的了,主要注意一下 F[ j ] = max( F[ j ] , F[ j - c[ i ] ] + w[ i ] )這個狀態轉移方程,一定要徹底明白方程的意思,剛開始的時候背下來也可以......
恩,差不多了,題目雖然簡單,但重要的是思想,掌握好了基礎的,才能繼續前行嘛~