洛谷 UVA12563 Jin Ge Jin Qu hao 题解

这道题其实是一道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 }
请各位大佬斧正(反正我不认识斧正是什么意思)

猜你喜欢

转载自www.cnblogs.com/handsome-zyc/p/11237327.html