您的位置:首页 > 其它

多重背包 (n种物品,每种m个)

2015-08-19 16:29 183 查看
const int MAXV = 1 << 9;
int d[MAXV],v,w;
int m,n,V;  //背包大小为V,n种物品,每种物品m个
void ZeroOnePack( int* f, int C, int W) {  //01背包
int v;
for( v = V; v >= C; v --)
f[v] = max( f[v], f[v - C] + W);
}
void CompletePack( int* f, int C, int W) {   //完全背包
int v;
for( v = C; v <= V; v ++)
f[v] = max( f[v], f[v - C] + W);
}
void MultiplePack( int* f, int C, int W, int M) {  //多重背包
int k = 1;
if( C * M >= V) {
CompletePack( f, C, W);
return;
}
while( k < M) {
ZeroOnePack(f, C * k, W * k);
M = M - k;
k <<= 1;
}
ZeroOnePack( f, C * M, W * M);
}
int main() {
// freopen("in.txt","r",stdin);
while(cin>>n>>V) {
memset(d,0,sizeof(d));
for(int i=0; i<n; i++) {
scanf("%d%d%d",&m,&v,&w);
MultiplePack(d,v,w,m);
}
cout<<d[V]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: