多重背包(二进制拆分)

#include<bits/stdc++.h>
using namespace std;
//......此处快读省略........
#define ll long long
int n,m;
int v1[1005],w1[1005],s[20005];
ll v[10005],w[10005];
ll f[20005];
int cnt;
int main(){
    read(n);read(m);

//以下是二进制拆分
    for(int i=1;i<=n;++i){
        read(v1[i]);read(w1[i]);read(s[i]);
        for(int j=1;j<=s[i];j<<=1){
            v[++cnt]=j*v1[i];
            w[cnt]=j*w1[i];
            s[i]-=j;
        }
        if(s[i]>0){
            v[++cnt]=s[i]*v1[i];
            w[cnt]=s[i]*w1[i];
        }
    }
//---------分割线----------//

//以下是01背包模板
    for(int i=1;i<=cnt;++i){
        for(int j=m;j>=v[i];--j){
            f[j]=max(f[j],f[j-v[i]]+w[i]);
        }
    }
    cout << f[m];
    return 0;
}
全部评论

相关推荐

06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务