/*
Raucous RockersYou just inherited the rights to N (1 <= N <= 20) previously unreleased songs recorded by the popular group Raucous Rockers. You plan to release a set of M (1 <= M <= 20) compact disks with a selection of these songs. Each disk can hold a maximum of T (1 <= T <= 20) minutes of music, and a song can not overlap from one disk to another.
Since you are a classical music fan and have no way to judge the artistic merits of these songs, you decide on the following criteria for making the selection:
- The songs on the set of disks must appear in the order of the dates that they were written.
- The total number of songs included will be maximized.
PROGRAM NAME: rockers
INPUT FORMAT
Line 1: | Three integers: N, T, and M. |
Line 2: | N integers that are the lengths of the songs ordered by the date they were written. |
SAMPLE INPUT (file rockers.in)
4 5 2 4 3 4 2
OUTPUT FORMAT
A single line with an integer that is the number of songs that will fit on M disks.
SAMPLE OUTPUT (file rockers.out)
3
*/
/*
ID: niepeng1
PROG: rockers
LANG: C++
*/
#include <stdio.h>
#define MAX 25
int dp[MAX][MAX][MAX], length[MAX];
main ()
{
/*这题动态规划没有思路,参照了答案,状态转移,及重复子问题真是难想,我又偷懒了*/
FILE *in = fopen ("rockers.in", "r");
FILE *out = fopen ("rockers.out", "w");
int a, b, c, d, best, numsongs, cdlength, numcds;
fscanf (in, "%d%d%d", &numsongs, &cdlength, &numcds);
for (a = 1; a <= numsongs; a++)
fscanf (in, "%d", &length[a]);
best = 0;
for (a = 0; a < numcds; a++)/* current cd */
for (b = 0; b <= cdlength; b++) /* number of minutes used */
for (c = 0; c <= numsongs; c++)
{ /* last song */
for (d = c + 1; d <= numsongs; d++)
{ /* new song */
if (b + length[d] <= cdlength)
{
if (dp[a][b][c] + 1 > dp[a][b + length[d]][d])
dp[a][b + length[d]][d] = dp[a][b][c] + 1;
}
else
{
if (dp[a][b][c] + 1 > dp[a + 1][length[d]][d])
dp[a + 1][length[d]][d] = dp[a][b][c] + 1;
}
}
if (dp[a][b][c] > best)
best = dp[a][b][c];
}
fprintf (out, "%d/n", best);
return 0;
}