多重背包(二进制拆分)

#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;
}
全部评论

相关推荐

把实习生当正职使昨天第一天就加班,晚上连口饭都没吃上,以后日子咋过,我不想干了
码农索隆:实习不怕忙,就怕干的活重复且没难度,要干就干那种有深度有难度的任务,这样才能快速的提升
实习吐槽大会
点赞 评论 收藏
分享
程序员小白条:你是沟通了900个,不是投了900份简历,你能投900份,意味着对面都要回复你900次,你早就找到实习了,没亮点就是这样的,别局限地区,时间投的也要早,现在都要7月了
点赞 评论 收藏
分享
_mos_:我以为手抄报简历就已经很顶了,没想到还有表格简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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