f[disk][song][ti] 表示用前disk张光盘,录制前song首歌曲(不一定录制第song首歌曲)的最大曲目数,并且当前在录的光盘剩余时间是ti
f[disk][song][ti] =
max( f[disk][song-1][ti], f[disk-1][song-1][T-a[song]] && disk > 1 && a[song] <= T, f[disk][song-1][ti-a[song]] && a[song] <= ti )
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- /*
- PROG: rockers
- LANG: C++
- ID: heben991
- */
- const int N = 25;
- int n, T, m, a[N], f[N][N][N];
- int main()
- {
- int i, disk, song, k, ti;
- freopen("rockers.in", "r", stdin);
- freopen("rockers.out","w",stdout);
- scanf("%d%d%d", &n, &T, &m);
- for(i = 1; i <= n; ++i) scanf("%d",a+i);
- for(disk = 1; disk <= m; ++disk)
- {
- for(song = 1; song <= n; ++song)
- {
- for(ti = 0; ti < a[song] && ti <= T; ++ti)
- {
- f[disk][song][ti] = f[disk][song-1][ti];
- if(disk>1 && a[song] <= T)
- f[disk][song][ti] >?= 1+f[disk-1][song-1][T-a[song]];
- }
- for(ti = a[song]; ti <= T; ++ti)
- {
- f[disk][song][ti] = f[disk][song-1][ti];
- f[disk][song][ti] >?= 1+f[disk][song-1][ti-a[song]];
- }
- }
- }
- printf("%d/n", f[m][n][T]);
- }
本文介绍了一种使用动态规划解决音乐录制问题的算法。该算法旨在最大化利用一定数量的光盘录制歌曲的数量,同时确保每张光盘不超过其最大容量。通过三维数组记录状态转移过程,实现了高效求解。

被折叠的 条评论
为什么被折叠?



