TOJ 3290
1475 ワード
タイトル:
Watch The Movie
テーマ接続:
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3290
テーマのタイプ:
ダイナミック企画-多次元リュックサック
データ構造:
リュックサックの問題、
制限条件は2つあります。
一つは時間Lで、どの映画にもその時間があります。合計はLを超えてはいけません。
一つは数量Mで、一つの映画は数量1のものに相当します。合計はMを超えてはいけません。
単純な01バックパックを利用して1次元を多く入れる方法。
多次元のリュックサックが実現できます。
証明:
省略する
ソースコード:
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バックパックを利用して1次元を多く入れる方法。
多次元のリュックサックが実現できます。
証明:
省略する
ソースコード:
#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
", dp[l][m] >= 0 ? dp[l][m] : 0 );
}
return 0;
}