分析:
经典的背包问题:
不过用两个数组,一个标记一共还能听多少歌曲,一个标记听歌的总时间。
不过如果采用滚动数组的话一个dp数组就足够用了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4;
int dp[55][maxn];
int ans[55][maxn];
int main(){
int n,t;
int T;
scanf("%d",&T);
for(int cs=1;cs<=T;cs++){
scanf("%d%d",&n,&t);
memset(dp,0,sizeof dp);
memset(ans,0,sizeof ans);
for(int i=1;i<=n;i++){
int a;scanf("%d",&a);
for(int j=0;j<t;j++){
dp[i][j]=(i==1?0:dp[i-1][j]);
ans[i][j]=(i==1?0:ans[i-1][j]);
if(j>=a){
if(dp[i][j]<=dp[i-1][j-a]+1){
if(dp[i][j]==dp[i-1][j-a]+1)
ans[i][j]=max(ans[i][j],ans[i-1][j-a]+a);
else ans[i][j]=ans[i-1][j-a]+a;
dp[i][j]=dp[i-1][j-a]+1;
}
}
}
}
printf("Case %d: %d %d\n",cs,dp[n][t-1]+1,ans[n][t-1]+678);
}
return 0;
}