zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    注册登录过程点滴(一):初始的想法分享是王道
    根据Cron表达式,通过Spring自带的CronSequenceGenerator类获取下次执行时间
    解决jqGrid中,当前页一直显示为0的问题
    使用JDK自带功能,实现一个简单的Web Service接口发布
    Linux 僵尸进程 ( Zombie or defunct )
    C语言赋值操作符
    面试题 ( ++a )和( a++ )
    关于学习Linux的经典书籍
    C语言中的 sizeof 问题
    条件变量 pthread_cond_wait ()
  • 原文地址:https://www.cnblogs.com/shenben/p/5827094.html
Copyright © 2011-2022 走看看