这题思路就是:讲最场的歌曲在最后一分钟播放,剩下n-1首歌曲在t-1时间内求最大值
以例子演示一下:
注意这里最大时长已经被预订最后一分钟播放
1 2 3 4 5 6 0 0 0 0 0 0 先加入时长为2的歌曲变为 0 2 2 2 2 2 加入时长为3的歌曲 0 2 3 3 5 5 最后返回的结果为dp[6]+a[n]即9 #include<bits/stdc++.h> using namespace std; int a[205],n,t; int dp[80005]; int main() { int T; scanf("%d",&T); while(T--) { memset(dp,0,sizeof(dp)); scanf("%d%d",&n,&t); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1);//从小到大排序 for(int i=1;i<=n-1;i++)//范围是n-1,最大的已经被预订为放在最后一分钟播放 { for(int j=t-1;j>=a[i];j--)//这里是从后往前推,保证每首歌只能听一遍 { dp[j]=max(dp[j],dp[j-a[i]]+a[i]); } } printf("%d\n",dp[t-1]+a[n]); } }