HDOJ 3496 Watch The Movie(二维背包)

题意:

题目给定n部电影,每部电影有时长和量化的意义,要求看m部电影,并且市场控制在 l 以内,转化为背包问题,让我们在n件物品中找正好m件物品塞进容量为l的包中,求最大的价值。

思路:

1. dp[i][j][v] 表示前 i 部电影选择 j 部并且背包容量为 v 时,所能获得的最大价值。

2. dp[i][j][v] = max(dp[i-1][j][v], dp[i-1][j-1][v-wk] + vk) 采用 01 背包的形式可以把 i 所在的维数占用空间省掉。

 

#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN = 110;
const int MAXD = 1010;
const int INFS = 0x3fffffff;

int dp[MAXN][MAXD];

int main()
{
    int cases;
    scanf("%d", &cases);
    while (cases--)
    {
        int n, m, vol;
        scanf("%d %d %d", &n, &m, &vol);

        memset(dp[0], 0, sizeof(dp[0]));

        for (int i = 1; i <= m; ++i)
            for (int v = 0; v <= vol; ++v)
                dp[i][v] = -INFS;

        for (int i = 1; i <= n; ++i)
        {
            int w, val;
            scanf("%d %d", &w, &val);

            for (int j = min(i, m); j >= 1; --j)
                for (int v = vol; v >= w; --v)
                    dp[j][v] = max(dp[j][v], dp[j-1][v-w] + val);
        }

        if (dp[m][vol] > 0)
            printf("%d\n", dp[m][vol]);
        else
            printf("0\n");
    }
    return 0;
}

 

posted @ 2013-02-18 14:41  kedebug  阅读(207)  评论(0编辑  收藏  举报