------------Prob-------------
You 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.
--------------Solution--------------
能这样欣赏音乐我六体投地啊。。。
二维DP
f[i][j]表示前i首歌中取j首所花费的CD数和最后一张CD的剩余时间
由问题目标易知应当使f[i][j]尽可能小
显然f[i][j]只有f[i-1][j]和f[i-1][j-1]转移的得到
状态量O(n^2)
转移代价O(1)
时间复杂度O(n^2)
---------------Code------------------
/*
ID:zst_0111
TASK:rockers
LANG:C++
*/
#include<stdio.h>
#include<stdlib.h>
int f[22][22][2];
int len[22];
int main()
{
int i,j,k,m,n;
int T;
freopen("rockers.in","r",stdin);
freopen("rockers.out","w",stdout);
scanf("%d%d%d",&n,&T,&m);
k=0;
for(i=1;i<=n;i++)
{
scanf("%d",&len[++k]);
if(len[k]>T)
k--;
}
n=k;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{
f[i][j][0]=214748364;
f[i][j][1]=T+1;
}
for(i=0;i<=n;i++)
{
f[i][0][0]=1;
f[i][0][1]=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
f[i][j][0]=f[i-1][j][0];
f[i][j][1]=f[i-1][j][1];
int fa,fb;
int ta=f[i-1][j-1][0];
int tb=f[i-1][j-1][1];
if(tb+len[i]<=T)
{
fa=ta;
fb=tb+len[i];
if(fa<f[i][j][0] || fa==f[i][j][0]&&fb<f[i][j][1])
{
f[i][j][0]=fa;
f[i][j][1]=fb;
}
}
else
{
fa=ta+1;
fb=len[i];
if(fa<f[i][j][0] || fa==f[i][j][0]&&fb<f[i][j][1])
{
f[i][j][0]=fa;
f[i][j][1]=fb;
}
}
}
for(i=n;i>=0;i--)
if(f[n][i][0]<=m)
{
printf("%d\n",i);
return 0;
}
return 0;
}