hdu 3496 DP

来源:互联网 发布:淘宝海报背景素材 编辑:程序博客网 时间:2024/05/17 02:35

这题的坑点在于题目要求的是恰好要看M部片子的最大价值。。。。。

so。。。。。初始化还有转移的时候要注意下。。。。。

dp【i】【j】【L】表示前i部片子,恰好看j部时间不超过L的最大价值

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[110][110][1100];int N, M, L;int w[110], v[110];int main(){    int T;    scanf( "%d", &T );    while( T-- ){        scanf( "%d%d%d", &N, &M, &L );        for( int i = 1; i <= N; i++ ){            scanf( "%d%d", &w[i], &v[i] );        }        memset( dp, -1, sizeof( dp ) );        for( int i = 0; i <= N; i++ ){            dp[0][0][i] = 0;        }        for( int i = 1; i <= N; i++ ){            for( int j = 0; j <= M; j++ ){                for( int k = 0; k <= L; k++ ){                    if( j > 0 && k >= w[i] && dp[i-1][j-1][k-w[i]] != -1 )                        dp[i][j][k] = max( dp[i][j][k], dp[i-1][j-1][k-w[i]] + v[i] );                    dp[i][j][k] = max( dp[i][j][k], dp[i-1][j][k] );                }            }        }        int ans = 0;        for( int i = 1; i <= L; i++ ){            ans = max( ans, dp[N][M][i] );        }        printf( "%d\n", ans );    }    return 0;}/*12 2 64 14 1*/



0 0