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 ",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 }
坑:注意读题,曲目数的优先级高于时间;