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.
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
一道dp不过存取物品有顺序的限制,细分一下情况就行。
/* ID: fwj_ona1 LANG: C++ TASK: rockers */ #include <stdio.h> #include <iostream> #include <memory.h> using namespace std; int N,T,M,R[20],dp[21][21][21]; int Dp(int r,int m,int t); int max(int a,int b); int main () { freopen ("rockers.in","r",stdin); freopen ("rockers.out","w",stdout); scanf("%d%d%d",&N,&T,&M); for(int i=0;i<N;i++) scanf("%d",&R[i]); memset(dp,-1,sizeof(dp)); printf("%d\n",Dp(0,M,T)); return 0; } int Dp(int r,int m,int t) { if(t==0) m--,t=T; if(dp[r][m][t]!=-1) return dp[r][m][t]; if(m==0) { dp[r][m][t]=0; return 0; } if(r+1==N) if((m==1 && t>=R[r]) || (m>1 && T>=R[r])) { dp[r][m][t]=1; return 1; } else { dp[r][m][t]=0; return 0; } if(t>=R[r]) dp[r][m][t]=max(Dp(r+1,m,t-R[r])+1,Dp(r+1,m,t)); else dp[r][m][t]=max(Dp(r+1,m,t),Dp(r,m-1,T)); return dp[r][m][t]; } int max(int a,int b) { return a>b?a:b; }