HDU - 3496 Watch The Movie(01背包)

来源:互联网 发布:中科院数据共享平台 编辑:程序博客网 时间:2024/06/11 17:16

题目大意:有N个碟片,你只能选择M个进行播放,最多能观看L分钟。给出每个碟片的播放时间和看完后能收获的快乐值,问能否看完这M个碟片,如果能全部看完的话,输出最大快乐值

解题思路:用dp[i][j]表示i分钟看完j个碟片的最大快乐值,然后背包即可

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 110;const int L = 1010;int n, m, l;int Time[N], rate[N];int dp[L][N];void init() {    scanf("%d%d%d", &n, &m, &l);    for (int i = 0; i < n; i++)         scanf("%d%d", &Time[i], &rate[i]);}void solve() {    memset(dp, -1, sizeof(dp));    for (int i = 0; i <= l; i++) dp[i][0] = 0;    for (int i = 0; i < n; i++)        for (int j = l; j >= Time[i]; j--)             for (int k = m - 1; k >= 0; k--)                 if (dp[j - Time[i]][k] != -1)                    dp[j][k + 1] = max(dp[j][k + 1], dp[j - Time[i]][k] + rate[i]);    int ans = 0;    for (int i = 0; i <= l; i++)        ans = max(dp[i][m], ans);    printf("%d\n", ans);}int main() {    int test;    scanf("%d", &test);    while (test--) {        init();        solve();    }    return 0;}
0 0
原创粉丝点击