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

UVa 12563 (01背包) Jin Ge Jin Qu hao

时间:2014-09-29 03:55:26      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   sp   

如此水的01背包,居然让我WA了七次。

开始理解错题意了,弄反了主次关系。总曲目最多是大前提,其次才是歌曲总时间最长。

题意:

在KTV房间里还剩t秒的时间,可以从n首喜爱的歌里面选出若干首(每首歌只能唱一次且如果唱就必须唱完),然后剩下至少1秒的时间来唱那首长678秒的歌曲。

总曲目最多的前提下,尽量使歌曲总时间最长。

分析:

所给时间为t,在t-1秒内进行01背包,num[i]来记录剩余时间为 i 时能长的最多曲目,如果曲目相同还要记录最长时间。

 

bubuko.com,布布扣
 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 10000;
 8 int a[55], dp[maxn], num[maxn];
 9 
10 int main(void)
11 {
12     #ifdef LOCAL
13         freopen("12563in.txt", "r", stdin);
14     #endif
15 
16     int T;
17     scanf("%d", &T);
18     for(int kase = 1; kase <= T; ++kase)
19     {
20         int n, t;
21         scanf("%d%d", &n, &t);
22         t--;
23         for(int i = 0; i < n; ++i)
24         {
25             scanf("%d", &a[i]);
26             if(a[i] > 180)    a[i] = 180;
27         }
28         memset(dp, 0, sizeof(dp));
29         memset(num, 0, sizeof(num));
30         for(int i = 0; i < n; ++i)
31             for(int j = t; j >= a[i]; --j)
32             {
33                 if(num[j] < num[j-a[i]] + 1)
34                 {
35                     num[j] = num[j-a[i]] + 1;
36                     dp[j] = dp[j-a[i]] + a[i];
37                 }
38                 else if(num[j] == num[j-a[i]] + 1)
39                 {
40                     dp[j] = max(dp[j], dp[j-a[i]] + a[i]);
41                 }
42             }
43         printf("Case %d: %d %d\n", kase, num[t]+1, dp[t]+678);
44     }
45 
46     return 0;
47 }
代码君

 

UVa 12563 (01背包) Jin Ge Jin Qu hao

标签:style   blog   http   color   io   os   ar   for   sp   

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/3999322.html

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