TOJ 3290


题目标题:

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 
#include 
#include 
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;
}



你可能感兴趣的:(ACM解题报告,动态规划)