UVa 12563 劲歌金曲(0-1背包)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 12563 劲歌金曲(0-1背包)相关的知识,希望对你有一定的参考价值。

https://cn.vjudge.net/problem/UVA-12563

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

思路:很明显背包容量为t-1,因为至少得留下1秒钟来放《劲歌金曲》。题目要求的首先唱的歌要多,其次才是要时间长。

         这里需要用到一个技巧:对决策进行一定的限定!在计算某个时间最多唱的歌曲时,必须是该时间内恰好唱完这些歌,时间多了不行。

         所以在下面的代码中,首先将d数组都声明为了-1,如果不是在该时间内正好唱完歌,那么d[j - a[i]] + 1就是0。

 1 #include<iostream> 
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 const int maxn = 5000+5;
 7 int a[maxn], d[maxn], t, n;
 8 
 9 int main()
10 {
11     //freopen("D:\\txt.txt", "r", stdin);
12     int cas,kase=0;
13     cin >> cas;
14     while (cas--)
15     {
16         memset(d, -1, sizeof(d));
17         d[0] = 0;
18         cin >> n >> t;
19         for (int i = 0; i < n; i++)
20             cin >> a[i];
21         for (int i = 0; i < n; i++)
22         {
23             for (int j = t - 1; j >= a[i]; j--)
24                 d[j] = max(d[j], d[j - a[i]] + 1);
25         }
26         int cnt = 0, sum;
27         for (int i = 0; i < t; i++)
28         {
29             if (d[i] >= cnt)
30             {
31                 cnt = d[i];
32                 sum = i;
33             }
34         }
35         printf("Case %d: %d %d\n", ++kase, cnt+1, sum + 678);
36     }
37     return 0;
38 }

 

以上是关于UVa 12563 劲歌金曲(0-1背包)的主要内容,如果未能解决你的问题,请参考以下文章

UVA12563 劲歌金曲

UVA12563Jin Ge Jin Qu hao(01背包)

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

UVA劲歌金曲

劲歌金曲

UVA 12563 "Jin Ge Jin Qu hao" (背包)