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

传送门

 

debug了好一会,突然发现,输出错了,emmm.........

明天再写debug历程;

(PS:ipad debug是真的繁琐)

 

题意:

  

题解:

  尽管题干中给的 t 的范围很大,但是 t ≤ 50*180+678;

1 int dp[maxn];///dp[i]:恰好唱i分钟时的最大曲目个数

AC代码:

 1 #include<bits/stdc++.h>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define memF(a,b,n) for(int i=0;i <= n;a[i++]=b);
 6 const int maxn=1e5+50;
 7 
 8 int n,T;
 9 int t[60];
10 int dp[maxn];
11 
12 void Solve()
13 {
14     memF(dp,-1,T);
15     dp[0]=0;
16     for(int i=1;i <= n;++i)
17     {
18         for(int j=T-1;j >= t[i];--j)
19         {
20             if(dp[j-t[i]] != -1)
21                 dp[j]=max(dp[j],dp[j-t[i]]+1);
22         }
23     }
24     int ans=*max_element(dp,dp+T-1);
25     for(int i=T-1;i >= 0;--i)
26         if(dp[i] == ans)///查找曲目数==ans的最长时间
27         {
28             printf("%d %d\n",dp[i]+1,i+678);
29             return ;
30         }
31 }
32 int main()
33 {
34     int test;
35     scanf("%d",&test);
36     for(int kase=1;kase <= test;++kase)
37     {
38         scanf("%d%d",&n,&T);
39         for(int i=1;i <= n;++i)
40             scanf("%d",t+i);
41 
42         printf("Case %d: ",kase);
43         Solve();
44     }
45     return 0;
46 }
View Code

坑:注意读题,曲目数的优先级高于时间;

 

posted @ 2019-06-01 23:54  HHHyacinth  阅读(133)  评论(0编辑  收藏  举报