首页 > 其他 > 详细

bzoj 1531 多重背包/单调队列

时间:2018-09-23 14:22:06      阅读:111      评论:0      收藏:0      [点我收藏+]

多重背包二进制优化终于写了一次,注意j的边界条件啊,疯狂RE

#include<bits/stdc++.h>

using namespace std;

int n,sum;

const int N=205;
const int C=20050;
const int K=20050;
const int inf=0x3f3f3f3f;

int w[N*C],idx,num[N*C];

int b[N],c[N];
//面值  个数 

int f[K],k;

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    scanf("%d",&k);
    idx=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=c[i];j<<=1){
            w[++idx]=b[i]*j;
            num[idx]=j;
            c[i]-=j;
        }
        if(c[i]>0){
            w[++idx]=b[i]*c[i];
            num[idx]=c[i];
        }
    }
    memset(f,inf,sizeof f);
    f[0]=0;
    for(int i=1;i<=idx;i++)
    for(int j=k;j>=w[i];j--)
    f[j]=min(f[j],f[j-w[i]]+num[i]);
    
    printf("%d",f[k]);return 0;
}

2.单调队列写法以后再写吧,真是没有看懂

bzoj 1531 多重背包/单调队列

原文:https://www.cnblogs.com/asdic/p/9692419.html

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