题目链接
题目大意
求在给定时间内,最多能唱多少歌曲,在最多歌曲的情况下,使唱的时间最长。
解题思路
虽然说t特别大,但是n之后50且每首歌的时间不超过180,所以可以把问题转化为01背包,我本来以为这个题是让求最多可以唱多久的歌。。。然后疯狂wa,读题真的很关键啊
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e5;
int n,t,p=1,c[maxn];
long long a[maxn],dp[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&t);
long long ans=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
ans+=a[i];
}
if(ans<t)
printf("Case %d: %d %lld\n",p++,n+1,ans+(long long)678);
else
{
memset(c,0,sizeof(c));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=t;j>=a[i];j--)
{
// dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
if(c[j]<c[j-a[i]]+1)
{
dp[j]=dp[j-a[i]]+a[i];
c[j]=c[j-a[i]]+1;
}
else if(c[j]==c[j-a[i]]+1&&dp[j]<dp[j-a[i]]+a[i])
{
dp[j]=dp[j-a[i]]+a[i];
c[j]=c[j-a[i]]+1;;
}
}
}
if(dp[t]<t)
printf("Case %d: %d %lld\n",p++,c[t]+1,dp[t]+(long long)678);
else if(dp[t]==t)
printf("Case %d: %d %lld\n",p++,c[t-1]+1,dp[t-1]+(long long)678);
}
}
return 0;
}