Jin Ge Jin Qu hao UVA - 12563 (0-1背包变形)

点击打开链接

题目大意:某人在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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值