【大意】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;
}