uva 12563 Jin Ge Jin Qu hao (01背包变形)

来源:互联网 发布:前端ajax请求php文件 编辑:程序博客网 时间:2024/05/22 12:07

题目地址:点击打开链接


题意:求在给定时间内,最多能唱多少歌曲,在歌曲最多的情况下,使唱的时间最长,时间到时如果当前歌还没结束,那会等该歌结束。


思路:类似01背包,歌曲时长作为重量,价值都为1,求t-1内最多能放多少歌,在歌曲最多的情况下再更新最后一首歌最晚能什么时候结束。不同于01背包的时,这里要求每首歌连续播放,所以在决策时要加一个条件,这首歌正好在这个时间点播放完。

参考:点击打开链接


代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 1e2+5;int ti[maxn], dp[50*200+678];int main(void){    int T, t, n, ca = 1;    cin >> T;    while(T--)    {        scanf("%d%d", &n, &t);        for(int i = 1; i <= n; i++)            scanf("%d", &ti[i]);        int maxNum = 0, maxTime = 0;        memset(dp, 0, sizeof(dp));        for(int i = 1; i <= n; i++)            for(int j = t-1; j-ti[i] >= 0; j--)            {                if(j == ti[i] || dp[j-ti[i]])//要求正好能放完                {                    dp[j] = max(dp[j], dp[j-ti[i]]+1);                    if(dp[j] > maxNum) maxNum = dp[j], maxTime = j;                    if(dp[j] == maxNum) maxTime = max(j, maxTime);                }            }        printf("Case %d: %d %d\n", ca++, maxNum+1, maxTime+678);    }    return 0;}


0 0
原创粉丝点击