您的位置:首页 > 其它

TOJ 3290

2014-02-26 09:09 369 查看
题目标题:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划