每人发,我就来解释一下吧!
读题可发现,若想听时间尽可能长的歌,在背包容量这一块儿不能设为t,就像样例那样:
t=3+4,那就转化成了01背包(原版)。所以在这里背包容量设为t-1;访问的物品数量因为背包容量,所以被设为了n-1
又因为抛弃了原版,所以在输入完毕后sort摆个序,最后的结果也就是f[t-1]+a[n]<-谁叫a[n]没被访问呢?
=================================代码时间================================

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int mx(int a,int b){return a>b?a:b;} 
int T,n,t,a[205],f[80005];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&t);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        memset(f,0,sizeof(f));
        for(int i=1;i<n;i++)
            for(int j=t-1;j>=a[i];j--)
                f[j]=mx(f[j],f[j-a[i]]+a[i]);
        printf("%d\n",f[t-1]+a[n]);
    }
    return 0;
}