“破锣摇滚”乐队 Raucous Rockers-c++题解

本文介绍了如何解决一个与音乐专辑制作相关的背包问题。给定一定数量的歌曲、每张CD的容量限制和可用的CD数量,目标是按时间顺序最大化选中的歌曲数。通过分析题目,确定这是一个二维费用背包问题,并提供了相应的动态规划解题思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目来源:洛谷P2736 原题面

题目描述

你刚刚继承了流行的“破锣摇滚”乐队录制的尚未发表的N(1 <= N <= 20)首歌的版权。你打算从中精选一些歌曲,发行M(1 <= M <= 20)张CD。每一张CD最多可以容纳T(1 <= T <= 20)分钟的音乐,一首歌不能分装在两张CD中。CD数量可以用完,也可以不用完。

不巧你是一位古典音乐迷,不懂如何判定这些歌的艺术价值。于是你决定根据以下标准进行选择:

1.歌曲必须按照创作的时间顺序在所有的CD盘上出现。(注:第i张盘的最后一首的创作时间要早于第i+1张盘的第一首)

2.选中的歌曲数目尽可能地多

输入输出格式
输入格式:
第一行: 三个整数:N,T, M
第二行: N个整数,分别表示每首歌的长度,按创作时间顺序排列。

输出格式:
一个整数,表示可以装进M张CD盘的乐曲的最大数目。

输入输出样例
输入样例:
4 5 2
4 3 4 2
输出样例:
3


为了练习背包做的题,一开始很懵,看了题解冷静了一下其实还行

题目理解

给你M个容量为T的背包,求出所有背包所能容纳的最多物品数目(需要按输入的次序放置)

样例说明
4件物品(大小分别为4,3,4,2),2个背包,单个背包容量为5
由于时间顺序约束,最多只能装下3件物品,方案如下:

CD序号 装载歌曲序号
1 1
2 2,4

解题思路

从有多个背包可以看出,dp数组应增加一维记录此状态,很明显,这是二维费用背包问题
状态转移上,由于时间顺序的约束(无法分割物品),转移时,这可以多产生一种状态。那么,f[i][j]表示当前使用i张CD时,最后一张CD为j分钟的情况下能承载歌曲的最大数目。来看方程:
f [ i ] [ j ] = m a x ( f [ i ] [ j ] , m a x ( f [ i − 1 ] [ T ] + 1 , f [ i ] [ j − t [ k ] ] + 1 ) ) f[i][j]=max(f[i][j],max(f[i-1][T]+1,f[i][j-t[k]]+1)) f[i][j]=max(f[i][j],

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值