UVA 473 - Raucous Rockers
给出n首歌, m张磁盘,每张可以存t分钟歌曲。和每首歌的时间。歌曲必须按顺序存放。
以磁盘的存储情况为状态,
dp[i][j][k]表示前i首歌存在前j个磁盘并且第j个磁盘花了k分钟的最大存储歌曲数量。
第i-1首歌可能存在第j个磁盘或者第j-1个磁盘。得出转移
dp[i][j][k]=max{dp[i−1][j][k−a[i]]+1dp[i−1][j−1][t]+1
可压缩空间复杂度到(m*t)
#include <bits/stdc++.h>
using namespace std;
int n, t, m;
int a[1005];
int dp[1005][1005];
int main () {
int T;
scanf ("%d", &T);
for (int cases=1; cases<=T; cases++) {
cin >> n >> t >> m;
for (int i=1; i<=n; i++) {
if (i == 1) scanf ("%d", &a[i]);
else scanf (", %d", &a[i]);
}
memset(dp, 0, sizeof(dp));
for (int i=1; i<=n; i++) {
for (int j=m; j>0; j--) {
for (int k=t; k>0; k--) {
if (k>=a[i]) {
dp[j][k] = max(dp[j][k], dp[j-1][t] + 1);
dp[j][k] = max(dp[j][k], dp[j][k-a[i]] + 1);
}
}
}
}
if (cases != 1) cout << endl;
cout << dp[m][t] << endl;
}
return 0;
}