码迷,mamicode.com
首页 > 其他好文 > 详细

CODEVS 1444 “破锣摇滚”乐队

时间:2016-06-26 18:11:49      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 

CODEVS 1444 “破锣摇滚”乐队

标签:

原文地址:http://www.cnblogs.com/liumengyue/p/5618248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!