IT民工
加油!

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;
}
posted on 2012-07-20 18:02  找回失去的  阅读(178)  评论(0编辑  收藏  举报