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 ] )这个状态转移方程,一定要彻底明白方程的意思,刚开始的时候背下来也可以......

        恩,差不多了,题目虽然简单,但重要的是思想,掌握好了基础的,才能继续前行嘛~




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章