首页 > 其他 > 详细

混合背包

时间:2020-06-06 21:31:56      阅读:46      评论:0      收藏:0      [点我收藏+]
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int n,k,w[maxn],v[maxn],dp[10*maxn]={0},nw[10*maxn],nv[10*maxn],cnt=0,c[maxn];
//计算出完全背包最多多少个,就变成了多重背包,01页看成多重,直接用二进制变成01,然后dp
//也可以完全背包不转化,用标记来和01区分,然后dp时根据不同的类型进行不同的for循环,可以滚动数组,这样快因为完全背包优化过了
//也可以直接对所有的分类,根据0 1 2,进行选择然后for循环,有完全背包的优化,快
int main() {
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>w[i]>>v[i]>>c[i];
        if(c[i]==-1) c[i]=1;
        if(c[i]==0) c[i]=k/w[i];//最多1000次
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=c[i];j<<=1){
            c[i]-=j;
            nv[++cnt]=v[i]*j;
            nw[cnt]=w[i]*j;
        }
        if(c[i]>0){
            nv[++cnt]=v[i]*c[i];
            nw[cnt]=w[i]*c[i];
        }
    }
    for(int i=1;i<=cnt;i++){
        for(int j=k;j>=nw[i];j--){
                dp[j]=max(dp[j],dp[j-nw[i]]+nv[i]);
        }
    }
    cout<<dp[k]<<endl;
    return 0;
}

 

混合背包

原文:https://www.cnblogs.com/MorrowWind/p/13056403.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!