Jin Ge Jin Qu hao UVA - 12563(背包dp)

题目链接:点我

题目大意求给定时间内能唱的最多数量的歌曲,以及时间

思路:

一开始以为是求最大时间,然后疯狂wa,又看了遍题目才知道是求最大数量,这道题明显就是一道背包dp,定义状态cnt[i][j]为前i首歌在j时间内,最大能唱的歌曲数量因为还要算算出时间,其实我们有两种做法,可以通过记录路径,然后求出时间,但是这样子还是挺麻烦的,我们可以通过在开一个dp[i][j]与cnt同步更新,有一点要注意,当cnt相同时没我们要更新出最大的时间(思路还是比较简单的)

ac代码

#include<cstdio>
#include<vector>
#include<cstring>
#include<map>
#include<iostream>
#include<sstream>
#include<queue>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 50*180+678+456;
int dp[55][maxn];
int cnt[55][maxn];
int cost[55];
int n;
int t;
int T;
int main()
{
    int kase = 1;
    cin>>T;
    while(T--)
    {cin>>n>>t;
        for(int i = 1 ;i<=n;i++)
        {
            cin>>cost[i];
        }
        memset(dp,-INF,sizeof(dp));
        memset(cnt,0,sizeof(cnt));
        for(int i = 0;i<=t;i++)
        {
            dp[0][i] = 0;
        }
        for(int i = 1 ;i<=n;i++)
        {
            for(int j = 0;j<=t;j++)
            {
                dp[i][j] = dp[i-1][j];
                cnt[i][j] = cnt[i-1][j];
                if(j>=cost[i])
                {
                    if(cnt[i][j]<cnt[i-1][j-cost[i]]+1)
                    {
                        dp[i][j] = dp[i-1][j-cost[i]]+cost[i];
                        cnt[i][j] = cnt[i-1][j-cost[i]]+1;
                    }
                    else if(cnt[i][j]==cnt[i-1][j-cost[i]]+1)
                    {
                        dp[i][j] = max(dp[i-1][j-cost[i]]+cost[i],dp[i][j]);
                    }
                }
            }
        }
        int first = cnt[n][t];
        int ans = dp[n][t];
        int ok = 0;
        cout<<"Case "<<kase++<<": "<<cnt[n][t-1]+1<<' '<<dp[n][t-1]+678<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值