[DP]USACO Section 3.4 Raucous Rockers

洛谷原题

【大意】N首歌,M个CD,每个CD只能容纳时间长度T的歌曲。每首歌不能拆分,且歌曲必须按照创作时间一一放入CD(这就是此题为啥是背包不是贪心什么的)。CD可以不用完,问最多可以装多少歌曲


【解法】题目实际上就是是二维费用背包变形,就看能不能看出来。看出来就简单了:一维费用是CD数,另一维是时间长度。

用F[i][j]表示第(前)i张CD,第i张CD有j分钟长度的最多能存放的歌曲数目

F[i][j]可以转移为:

情况1:不选,即F[i][j]

情况2:选,并且塞入这个CD,即F[i][j-time[i]] + 1;

情况3:选,并且放入一个新CD,即F[i-1][T] + 1;

#include <iostream>
using namespace std;

int n, t, m, ans;
int v[101], f[51][101];
 //f[i][j]表示用i张CD,第i个CD用j分钟的最多的歌曲数目
int main() {
	cin >> n >> t >> m;
	for(int i=1; i<=n; i++) cin >> v[i];
	for(int i=1; i<=n; i++)
		for(int k=m; k>=1; k--)
			for(int j=t; j>=v[i]; j--)
				f[k][j] = max(f[k][j], max(f[k-1][t]+1, f[k][j-v[i]] + 1));
	cout << f[m][t] << endl;
	return 0;
}



...

猜你喜欢

转载自blog.csdn.net/Binary_Heap/article/details/79274605