题目来源:洛谷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],