BZOJ 1531 二进制优化多重背包

思路:

讲道理我应该写单调队列优化多重背包的

但是我不会啊

但是我现在! 还不会啊

我就写了个二进制优化的..

过了

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,cpy[222],b[3333],c[3333],f[20001],jy,xx,top,k;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&cpy[i]);
    for(int i=1;i<=n;i++){
        scanf("%d",&xx),jy=0;
        while(xx){
            if(xx>=(1<<jy))c[++top]=(1<<jy),xx-=(1<<jy);
            else c[++top]=xx,xx=0;
            b[top]=cpy[i]*c[top],jy++;
        }
    }
    scanf("%d",&k);
    memset(f,0x3f,sizeof(f)),f[0]=0;
    for(int i=1;i<=top;i++)
        for(int j=k;j>=b[i];j--)
            f[j]=min(f[j],f[j-b[i]]+c[i]);
    printf("%d\n",f[k]);
}

 

posted @ 2017-03-10 19:48  SiriusRen  阅读(345)  评论(1编辑  收藏  举报