1444 “破锣摇滚”乐队

1444 “破锣摇滚”乐队

 

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 白银 Silver
 
 
 
题目描述 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

数据范围及提示 Data Size & Hint
 

分类标签 Tags 点此展开 

 
暂无标签
 
分析:
题目很好,就是数据有点水。

f[i][k][j] 前i首歌用了k张CD,第k张CD的容量为j的最大数量

对于第i首歌,可以把它放到前面的cd中,也可以新开一张cd。

在普通的背包中,f[j]表示最大价值,所以这里可以用f[k][j] 表示前k张cd上的最大数量

f[k][j]=max(f[k][j],f[k-1][t]+1);// 新开一张cd
f[k][j]=max(f[k][j],f[k][j-v[i]]+1);//放到原来的cd上

AC代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
#define N 22
int n,m,t,v[N],f[N][N];//f[k][j] k张CD,第k张CD的容量为j的最大数量 
int main(){
    freopen("sh.txt","r",stdin);
    scanf("%d%d%d",&n,&t,&m);
    for(int i=1;i<=n;i++) scanf("%d",&v[i]);
    for(int i=1;i<=n;i++){
        for(int k=m;k;k--){
            for(int j=t;j>=v[i];j--){
                f[k][j]=max(f[k][j],max(f[k-1][t],f[k][j-v[i]])+1);
            }
        }
    }
    printf("%d",f[m][t]);
    return 0;
}

 

posted @ 2016-08-31 18:25  神犇(shenben)  阅读(173)  评论(0编辑  收藏  举报