http://www.rqnoj.cn/Problem_98.html
裸的多重背包
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N, V; const int MAXV = 1 << 9; int f[MAXV]; void ZeroOnePack( int f[], int C, int W) { 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() { int m, w, s; while( scanf( "%d%d", &N, &V) == 2) { memset( f, 0, sizeof (int) * (V + 1)); for( int i = 1; i <= N; i ++) { scanf( "%d%d%d", &m, &w, &s); MultiplePack( f, w, s, m); } printf( "%d\n", f[V]); } return 0; }