zoukankan      html  css  js  c++  java
  • 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;
    }

     

  • 相关阅读:
    BZOJ2243: [SDOI2011]染色
    BZOJ3747: [POI2015]Kinoman
    BZOJ1293: [SCOI2009]生日礼物
    BZOJ3626 [LNOI2014]LCA
    BZOJ3514 Codechef MARCH14 GERALD07加强版
    BZOJ3295 [CQOI2011]动态逆序对
    BZOJ2588 [SPOJ10628]Count on a tree
    BZOJ1036 [ZJOI2008]树的统计Count
    CODEVS1490 [CTSC2008]网络管理
    BZOJ1070 [SCOI2007]修车
  • 原文地址:https://www.cnblogs.com/kedebug/p/2915647.html
Copyright © 2011-2022 走看看