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;
}
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------