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

UVA12563 Jin Ge Jin Qu hao(DP, 背包+技巧)

时间:2015-07-27 18:58:15      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:动态规划   uva   

题意:求在给定时间内,最多能唱多少歌曲,在最多歌曲的情况下,使唱的时间最长。

该题类似于01背包问题,可用01背包问题的解题思路来求,每个歌曲相当于物品,歌曲的长度相等于物品重量,每个歌曲的“价值”为1。由于金歌劲曲时间最长,所以最后要留至少1秒时间开始唱金歌劲曲,所以计算t-1时间内最多唱的歌曲和时间,最终答案为歌曲数加1,时间加上金歌劲曲的时间。这里我使用滚动数组计算这个值, 用len记录t-1。

需要注意的是,由于要求是连续唱歌,且要求在最多歌曲数的情况下时间最长,如果按普通的背包存储,很难得到最长时间,因为f[len] 只存储了最多的歌曲数,但并不知道这些歌曲到底唱了多少时间。假设最多歌曲数为num, 唱num首歌曲最少时间为tmin, 那么数组中从f[tmin]到f[len]都等于num,我们无法得知唱num首歌的最大时间。比如说len = 10, t[1] = 5, t[2] = 8, 那么f[5] 到 f[10] 都等于1, 无法知道唱从5到10哪个是唱1首歌的最长时间。如何处理呢?

这里需要用到一个技巧:对决策进行一定的限定!在计算某个时间最多唱的歌曲时,必须是该时间内恰好唱完这些歌,时间多了不行。即f[j]表示的是在j 的时间恰好用完的情况下最多能唱多少首歌。比如上面的例子只有f[5] 和f[8]等于1,其他的都等于0。这样的话处理时先算出最多唱的歌曲数 num,然后从j = len开始遍历数组f, 第一个等于num的就是在最多歌曲情况下的最长时间。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int MAXN = 10000;
int f[MAXN],  t[55];

int main()
{
    int T, n, cas, i, j, len, ma;
    scanf("%d", &T);
    for(cas = 1; cas <= T; cas++)
    {
        scanf("%d%d", &n, &len);
        len--;                         //留最后一秒开始唱金歌劲曲
        for(i = 1; i <= n; i++)
            scanf("%d", &t[i]);

        memset(f, 0, sizeof(f));
        ma = 0;         //记录最多歌曲数。
        for(i = 1; i <= n; i++)
        {
            for(j = len; j >= t[i]; j--)
            {
                if(f[j - t[i]] >= 1|| j == t[i])  //在j时间内可以唱完第i首歌。
                {
                    f[j] = max(f[j], f[j - t[i]] + 1);
                    ma = max(ma, f[j]);
                }
            }
        }
        for(i = len; f[i] != ma; i--);  //寻找唱最多歌情况下,时间最长的那个
        if(ma == 0)                             //在给定时间内无法唱完任何一首歌
            printf("Case %d: %d %d\n", cas, 1, 678);
        else
            printf("Case %d: %d %d\n", cas, 1 + ma, i + 678);
    }
    return 0;
}

UVA12563 Jin Ge Jin Qu hao(DP, 背包+技巧)

标签:动态规划   uva   

原文地址:http://blog.csdn.net/yanzheshi/article/details/47086461

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