zoukankan      html  css  js  c++  java
  • CODEVS 1444 “破锣摇滚”乐队

    多个相同的背包,求最大价值

    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-w[i]]+1); //放到原来的cd上,为什么这样写我也不知道

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int f[22][22]; //f[k][j] k张CD,第k张CD的容量为j的最大数量 
    int w[22];
    int n,m,t;
    int main()
    {
        scanf("%d%d%d",&n,&t,&m);
        for (int i=1;i<=n;i++)
            scanf("%d",&w[i]);
        for (int i=1;i<=n;i++)
            for (int k=m;k>=1;k--)
                for (int j=t;j>=w[i];j--)
                f[k][j] = max(f[k][j],max(f[k-1][t],f[k][j-w[i]])+1);
        printf("%d",f[m][t]);    
    }
    View Code
  • 相关阅读:
    鸡尾酒之白兰地
    Hadoop面试总结(三)Hbase、Spark
    Hadoop面试总结(二)MySQL
    Hadoop面试总结(一)Linux命令、Scala
    View
    用户画像项目规划
    Apache kafka
    Resume
    蔡学镛
    【git】git常用操作
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5618248.html
Copyright © 2011-2022 走看看