对于每个曲子,按照时间来进行动态规划,对于不同的曲子,都是从结束时间的前一秒开始进行倒计时,然后必要的时候更新某个时刻所唱曲子的数量。具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
using namespace std;
int T,n,t;
int time_table[100000];
int main(){
cin >> T;
int Case = 1;
while (T--){
int ans = 0;
memset(time_table, 0, sizeof(time_table));
cin >> n >> t;
t--;
vector<int> arr;
for (int i = 0; i < n; i++){
int a;
cin >> a;
arr.push_back(a);
}
for (int i = 0; i < n; i++){
for (int j = t; j >= arr[i]; j--){
if (time_table[j-arr[i]] || j == arr[i]){
time_table[j] = max(time_table[j],time_table[j-arr[i]]+1);
ans = max(ans,time_table[j]);
}
}
}
int exist;
for (exist = t; time_table[exist] != ans; exist--);
cout << "Case " << Case++ << ": "<<ans+1<<" ";
if (!ans) cout << "678" << endl;
else cout << exist + 678 << endl;
}
return 0;
}