01背包的处理过程

int a[1005]={0};//全局数组
void zeroonepack(int T,int t,int p){//总容量,单件物品消耗,单件价值
    for(int i=T;i>=t;i--){
        a[i]=max(a[i],a[i-t]+p);
    }
}    

 

完全背包:

int a[1005]={0};

void completepack(int T,int t,int p){
    for(int i=t;i<=T;i++){
        a[i]=max(a[i],a[i-t]+p);
    }
}

 

多重背包:

int a[1005];

void zeroonepack(int T,int t,int p){//总容量,单件物品消耗,单件价值
    for(int i=T;i>=t;i--){
        a[i]=max(a[i],a[i-t]+p);
    }
}


void completepack(int T,int t,int p){//总容量,单件物品消耗,单件价值
    for(int i=t;i<=T;i++){
        a[i]=max(a[i],a[i-t]+p);
    }
}

void multiplepack(int V,int v,int w,int m){//总容量,单件物品消耗,单件价值,物品数量
    int k;
    if(v*m>=V){
        completepack(V,v,w);
        return ;
    }
    k=1;
    while(k<=m){
        zeroonepack(V,k*v,k*w);
        m=m-k;
        k*=2;
    }
    zeroonepack(V,v*m,w*m);
}