状态方程总是难想的。
#include <stdio.h>
#include <stdlib.h>
int max(int a,int b)
{
if(a<b)
return b;
return a;
}
int main()
{
FILE *fin=fopen("rockers.in","r");
FILE *fout=fopen("rockers.out","w");
int n;
int m;
int t;
int i ,j,k;
int songtime[30]={0};
int ans[30][30][30]={0}; //ans[i][j][k]表示前i 首歌用的j个盘子
fscanf(fin,"%d %d %d",&n,&t,&m); //最后一个用了k时间的最多曲目数
for(i=1;i<=n;i++)
fscanf(fin,"%d",&songtime[i]);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(k=1;k<=t;k++)
if(k<songtime[i]) //表示不能加第i首歌
{
ans[i][j][k]=max(ans[i-1][j-1][t],ans[i-1][j][k]);
}
else //表示可以加第i首歌
{
ans[i][j][k]=max(ans[i-1][j-1][t],ans[i-1][j][k-songtime[i]])+1;
}
fprintf(fout,"%d\n",ans[n][m][t]);
return 0;
}