题目:
http://acm.hdu.edu.cn/showproblem.php?pid=3496
题意:
有n部电影,每一部都有时长和价值,要求从其中选出m个,总时间不超过l,求能得到的最大价值
思路:
有两个限定条件:物品数和时间,然后套用二维费用背包,注意初始化问题,因为要求恰好m个,因此刚开始只有dp[0][0]是合法状态,置为0,其他的状态全置为-1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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;
}

1078

被折叠的 条评论
为什么被折叠?



