题目标题:
Watch The Movie
题目连接:
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3290
题目类型:
动态规划 - 多维背包
数据结构:
struct LMIC_MOVIE
{
int t, v;
};
// 时间, 个数
int dp[1005][1005];
思路分析:
背包问题,
限制条件有2个.
一个是时间L,每一部电影都有其时间, 总和不能超过L
一个是数量M,每一部电影相当于数量1的物品,总和不能超过M
利用单纯01背包多加一维的方法
便可以实现多维背包
证明:
略
源代码:
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
struct LMIC_MOVIE
{
int t, v;
};
// 时间, 个数
int dp[1005][1005];
int main()
{
int i, j, k, t, n, m, l;
LMIC_MOVIE mie[105];
scanf( "%d", &t );
while( t -- )
{
scanf( "%d%d%d", &n, &m, &l );
for (i = 0; i <= l; i ++ )
{
for (j = 0; j <= m; j ++ )
{
if( j )
{
dp[i][j] = -999999;
}
else
{
dp[i][j] = 0;
}
}
}
for( i = 1; i <= n; i ++ )
{
scanf( "%d%d", &mie[i].t, &mie[i].v );
}
for( i = 1; i <= n; i ++ )
{
for( j = l; j >= mie[i].t; j -- )
{
for( k = m; k >= 1; k -- )
{
if( dp[j][k] < dp[j - mie[i].t][k - 1] + mie[i].v )
{
dp[j][k] = dp[j - mie[i].t][k - 1] + mie[i].v;
}
}
}
}
printf( "%d\n", dp[l][m] >= 0 ? dp[l][m] : 0 );
}
return 0;
}