bzoj 1531 Bank notes 多重背包/单调队列

多重背包二进制优化终于写了一次,注意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.单调队列写法以后再写吧,真是没有看懂

posted @ 2018-09-23 12:36  ASDIC减除  阅读(203)  评论(0编辑  收藏  举报