【双DP】唱最多的歌

UVA 12563 Jin Ge Jin Qu hao

题意:

已知想唱的歌曲n和剩余时间t,和每首歌的时间a[i],以及一首能唱很久的jingejin,求最多能唱歌数和唱歌时间。

规定每首歌开唱后不被打断,开唱后必须唱完,且只能唱一次。

样例举例了最好每次留一分钟去开始jingejin。

题解:

使用两个背包,一个b[i]存唱的时间,一个c[i]存唱的数量。

注意1时间范围是骗人的,50首各3分钟没那么久

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int N,n,time,cnt=0;
    cin>>N;
    while(N--){
        cin>>n>>time;
        int a[55],b[10000]={0},c[10000]={0},mn=0,tn;
        for(int i=0;i<n;i++)cin>>a[i];
        sort(a,a+n);
        for(int i=0;i<n;i++){
            for(int j=time-1;j>=a[i];j--){
                if(c[j]<c[j-a[i]]+1||(c[j]==c[j-a[i]]+1&&b[j]<b[j-a[i]]+a[i])){
                    b[j]=b[j-a[i]]+a[i];
                    c[j]=c[j-a[i]]+1;
                }
            }
        }
        if(time>0){tn=b[time]+678;mn=c[time]+1;}
        cout<<"Case "<<++cnt<<": "<<mn<<' '<<tn<<endl;
    }
}

注意2先判断唱歌数目,再判断唱歌时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值