// 劲歌金曲.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int song;
int dp[180 * 50 + 678 + 10];int n;
int main()
{
//这题我本来想着用二维数组来做,但其实用滚动数组来做就行
//因为dp[i][j]=max(dp[i-1][j],dp[i-1][j-song]+1)只与上一层的代价有关,所以我们可以用滚动数组来做
int T;
cin >> T;
while (T--)
{
int t;
cin >> n;cin >> t;
memset(dp, 0xff, sizeof(dp));
dp[0] = 0;
for (int i = 1;i <= n;i++)
{
cin >> song;
//为什么j要从末尾开始已经在回文字符串中有过解释
for (int j = t-1;j >=song;j--)
{//https://zhuanlan.zhihu.com/p/68351189
dp[j] = max(dp[j - song]+1, dp[j]);
}
}
//这样算出来的dp值就是到第j秒情况下能唱最多歌的情况
int ans=t-1;
for (int j = t - 1;j >= 0;j--)
{//看看到哪里唱歌的数量是最多的,因为可能有后面的时间不够一首的情况存在,题目要求的也是我们能唱多少秒的歌曲
if (dp[j] > dp[ans]) {
ans = j;
}
}
cout << dp[ans] + 1 <<" "<< ans+678 << endl;
}
}
07-03
1771