Codevs 1444 “破鑼搖滾”樂隊
阿新 • • 發佈:2017-06-14
using dev rdquo head 背包 amp sca 最大數 版權
輸入描述 Input Description
1444 “破鑼搖滾”樂隊
題目描述 Description你剛剛繼承了流行的“破鑼搖滾”樂隊錄制的尚未發表的N(1 <= N <= 20)首歌的版權。你打算從中精選一些歌曲,發行M(1 <= M <= 20)張CD。每一張CD最多可以容納T(1 <= T <= 20)分鐘的音樂,一首歌不能分裝在兩張CD中。
不巧你是一位古典音樂迷,不懂如何判定這些歌的藝術價值。於是你決定根據以下標準進行選擇:
1.歌曲必須按照創作的時間順序在CD盤上出現。
2.選中的歌曲數目盡可能地多。
第一行: 三個整數:N, T, M.
第二行: N個整數,分別表示每首歌的長度,按創作時間順序排列。
輸出描述 Output Description一個整數,表示可以裝進M張CD盤的樂曲的最大數目。
樣例輸入 Sample Input4 5 2
4 3 4 2
樣例輸出 Sample Output3
/* 變形的背包問題 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 “破鑼搖滾”樂隊