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

bzoj 1531 多重背包/单调队列

时间:2018-09-23 15:07:00      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:include   printf   单调队列   多重   for   clu   int   name   min   

多重背包二进制优化终于写了一次,注意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 多重背包/单调队列

标签:include   printf   单调队列   多重   for   clu   int   name   min   

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

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