Jin Ge Jin Qu hao
UVA - 12563
题意: 给你 n 个歌曲 和 你的唱歌的时间。 接下来是每一首歌 的时间长度 , 但是在
ktv 唱歌有个bug 就是在你定的时间接受之前你再点一首歌, 假设你定了 100 秒
在95秒是你选择唱了一首 劲歌金曲 那么 就相当于你多唱了 678-5 秒 你的任务是在唱的歌曲数目尽量多的情况下 要求唱 的时间尽量的长。
思路:要求 在唱歌数目尽量多的情况下 要求时间尽量的长,, 那么我们考虑 在 ,
m-1 秒内 我们能唱的最大的歌曲数目 , 当然是0 1 背包的思路, 考虑 能唱的最大的时间长度。 那么就是在 num相等的情况下,要 保证 时间time 尽量的的d大 ,那么
我们可以定义一个结构体背包, 然后定义 结构体的优先级 ,就可以了 。
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N =180*55;
struct node
{
int num;
int time;
bool operator < (const node &a ) const
{
if(a.num==num) return a.time>time;
else return a.num>num;
}
}dp[N];
int n,m;
int t[55];
int main()
{
int cas;
cin>>cas;
for(int kk=1;kk<=cas;kk++)
{
cin>>n>>m;
memset(dp,0,sizeof(dp));
int sum=0;
for(int i=1;i<=n;i++)
{
cin>>t[i];
sum+=t[i];
}
int maxt=min(sum,m-1);
for(int i=1;i<=n;i++)
{
for(int j=maxt;j>=t[i];j--)
{
node tmp;
tmp.num=dp[j-t[i]].num+1;
tmp.time=dp[j-t[i]].time+t[i];
if(dp[j]<tmp)
{
dp[j]=tmp;
}
}
}
printf("Case %d: ",kk);
printf("%d %d\n",dp[maxt].num+1,dp[maxt].time+678);
}
return 0;
}