1. 程式人生 > >Codevs 1444 “破鑼搖滾”樂隊

Codevs 1444 “破鑼搖滾”樂隊

using dev rdquo head 背包 amp sca 最大數 版權

1444 “破鑼搖滾”樂隊

題目描述 Description

你剛剛繼承了流行的“破鑼搖滾”樂隊錄制的尚未發表的N(1 <= N <= 20)首歌的版權。你打算從中精選一些歌曲,發行M(1 <= M <= 20)張CD。每一張CD最多可以容納T(1 <= T <= 20)分鐘的音樂,一首歌不能分裝在兩張CD中。

不巧你是一位古典音樂迷,不懂如何判定這些歌的藝術價值。於是你決定根據以下標準進行選擇:

1.歌曲必須按照創作的時間順序在CD盤上出現。

2.選中的歌曲數目盡可能地多。

輸入描述 Input Description

第一行: 三個整數:N, T, M.

第二行: N個整數,分別表示每首歌的長度,按創作時間順序排列。

輸出描述 Output Description

一個整數,表示可以裝進M張CD盤的樂曲的最大數目。

樣例輸入 Sample Input

4 5 2

4 3 4 2

樣例輸出 Sample Output

3

/*
  變形的背包問題
  dp[j][k]表示把當前的歌曲裝到第j個CD,且已經裝了k個容量時,能裝的最多的歌曲數
  當裝第到第j個CD中時,dp[j][k]=dp[j][k-w[i]]+1;
  當第j個裝不開,要裝到第j-1個中,即dp[j][k]=dp[j-1][m]+1。 
*/ #include<iostream> #include<cstdio> using namespace std; #define maxm 30 #define maxt 30 int n,m,t,dp[maxm][maxt],w[maxm]; int main(){ scanf("%d%d%d",&n,&m,&t); for(int i=1;i<=n;i++)scanf("%d",&w[i]); for(int i=1;i<=n;i++) for(int j=t;j>=1
;j--) for(int k=m;k>=w[i];k--){ dp[j][k]=max(dp[j][k],dp[j][k-w[i]]+1); dp[j][k]=max(dp[j][k],dp[j-1][m]+1); } printf("%d",dp[t][m]); }

Codevs 1444 “破鑼搖滾”樂隊