• 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;
    }
  • 相关阅读:
    linux系统调整磁盘分区
    Linux命令sort和uniq 的基本使用
    路由的执行优先级
    Linux命令xargs的使用
    wget命令的使用
    Linux环境下错误码及意义总结
    Linux下使用ip netns命令进行网口的隔离和配置ip地址
    MongoDB初始化创建管理员账户登录
    Python字符串的截取原理,下标的位置图示
    Python操作MongoDB查询时处理ObjectId
  • 原文地址:https://www.cnblogs.com/shenben/p/5827094.html
Copyright © 2020-2023  润新知