码迷,mamicode.com
首页 > 其他好文 > 详细

uva 473(dp)

时间:2015-07-18 11:01:29      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

题意:按创作时间给出n首歌每首歌的时间ti,然后按创作时间装到m个光盘内,给出光盘最大分钟数t,问m个光盘最多总共放多少首歌。
题解:对于每首歌都可以选或者不选,如果选择了这首歌,是否把这首歌当做第j张光盘的第一首歌。f[i][j][k]表示前i首歌放到第j张光盘里用分钟数是k的容量最多放多少首歌。
f[i][j][k] = f[i - 1][j][k]表示要选这首歌
f[i][j][k] = max(f[i][j][k], f[i][j - 1][t] + 1)表示把这首歌当做第j张光盘的第一首歌
f[i][j][k] = max(f[i][j][k], f[i][j][k-a[i]] + 1)表示不选这首歌当第j张光盘第一首歌
如果用二维滚动数组代替第一维,j要逆序枚举。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1000;
int n, m, t, f[N][N], a[N];

int main() {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        memset(f, 0, sizeof(f));
        scanf("%d%d%d", &n, &t, &m);
        for (int i = 1; i <= n; i++)
            scanf("%d%*c", &a[i]);
        for (int i = 1; i <= n; i++) {
            for (int j = m; j >= 1; j--) {
                for (int k = t; k >= a[i]; k--) {
                    f[j][k] = max(f[j][k], f[j - 1][t] + 1);
                    f[j][k] = max(f[j][k], f[j][k - a[i]] + 1);
                }
            }
        }
        printf("%d\n", f[m][t]);
        if (cas)
            printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 473(dp)

标签:

原文地址:http://blog.csdn.net/hyczms/article/details/46940143

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!