1. 程式人生 > >01揹包的c語言實現

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 ] )這個狀態轉移方程,一定要徹底明白方程的意思,剛開始的時候背下來也可以......

        恩,差不多了,題目雖然簡單,但重要的是思想,掌握好了基礎的,才能繼續前行嘛~