Jin Ge Jin Qu hao UVA

来源:互联网 发布:滨州大数据产业园 编辑:程序博客网 时间:2024/05/24 02:09

点击打开链接

题目大意:某人在KTV唱歌,他一共剩余t秒的时间,例如:在还有15秒时再唱一首2分钟的歌,则实际上是多唱了105秒。他一定会在最后唱《Jin Ge Jin Qu》时长678秒,当然是在还有剩余时间的时候开始唱的。

在剩余的t秒里,他有n首自己喜欢的歌要唱,给出n首歌的时长。问要使得唱的曲目尽量的多,且多唱的时间尽量的多是多少;具体题意看链接或紫书。

输出唱的曲目数和唱的时间数。

ps:此题是紫书p274的例题,这是一个0-1背包的变形,可以把剩余的t秒当成背包,然后价值和重量都是n首歌的时长。

不同的是这里要求了两个条件,把这两个条件都当做dp的一部分,因为有优先条件,所以也就和简单的背包一样了。

这个题的一个坑点是给出t的范围是t<=1000000000,显然是开不下这个数组的,可是他又说每首歌的时长不超过3分钟,也就是t最大为50*180+678,完全是障眼法

#include <iostream>#include <bits/stdc++.h>using namespace std;int v[100];struct node{    int k;    int time;} dp[10000];int main(){    int t,w=0;    scanf("%d",&t);    while(t--)    {        int n,V;        scanf("%d%d",&n,&V);        int num=0;        for(int i=1; i<=n; i++)        {            scanf("%d",&v[i]);            num+=v[i];        }        memset(dp,0,sizeof(dp));        for(int i=1; i<=n; i++)        {            for(int j=V; j>v[i]; j--)            {                node temp;                temp.k=dp[j-v[i]].k+1;                temp.time=dp[j-v[i]].time+v[i];                if((temp.k>dp[j].k)||(temp.k==dp[j].k&&temp.time>dp[j].time))                {                    dp[j]=temp;                }            }        }        //cout<<dp[V]<<endl;        printf("Case %d: %d %d\n",++w,dp[V].k+1,dp[V].time+678);    }    return 0;}


0 0
原创粉丝点击