HDU 3496 Watch The Movie 二维费用背包

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=3496

题意:

有n部电影,每一部都有时长和价值,要求从其中选出m个,总时间不超过l,求能得到的最大价值

思路:

有两个限定条件:物品数和时间,然后套用二维费用背包,注意初始化问题,因为要求恰好m个,因此刚开始只有dp[0][0]是合法状态,置为0,其他的状态全置为-1

#include 
#include 
#include 
#include 

using namespace std;

const int N = 110, INF = 0x3f3f3f3f;

int dp[N*10][N];

int main()
{
    int t, n, m, l;
    int ti[N], v[N];
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d%d", &n, &m, &l);
        for(int i = 1; i <= n; i++) scanf("%d%d", &ti[i], &v[i]);
        memset(dp, -1, sizeof dp);
        dp[0][0] = 0;
        for(int i = 1; i <= n; i++)
            for(int j = l; j >= ti[i]; j--)
                for(int k = m; k >= 1; k--)
                {
                    if(dp[j-ti[i]][k-1] == -1) continue;
                    dp[j][k] = max(dp[j][k], dp[j-ti[i]][k-1] + v[i]);
                }
        int res = 0;
        for(int i = 1; i <= l; i++) res = max(res, dp[i][m]);
        printf("%d\n", res);
    }
    return 0;
}

你可能感兴趣的:(背包)