这道题其实是一道01背包的变形题,主要思路如下:在不把剩余时间用光的前提下(剩余时间>0),尽可能的多唱歌。于是我们可以用dp[i]表示的是到当前i秒时,最多可以唱多少歌。
状态转换方程:dp[k]=max(dp[k],dp[k-yy]+1);最后输出可以唱多少歌。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,t,m,yy; 4 int dp[100000]; 5 int main() 6 { 7 cin>>n; 8 for(int i=1;i<=n;i++) 9 { 10 memset(dp,0x8f,sizeof(dp)); 11 cin>>m>>t; 12 dp[0]=0; 13 for(int j=1;j<=m;j++) 14 { 15 cin>>yy; 16 for(int k=t-1;k>=yy;k--) 17 { 18 dp[k]=max(dp[k],dp[k-yy]+1); 19 } 20 } 21 int ans; 22 for(int j=ans=t-1;j>=0;j--) 23 { 24 if(dp[j]>dp[ans])ans=j; 25 } 26 cout<<"Case"<<" "<<i<<":"<<" "<<dp[ans]+1<<" "<<ans+678<<endl; 27 } 28 return 0; 29 }
请各位大佬斧正(反正我不认识斧正是什么意思)