POJ 2392 Space Elevator

题目链接

多重背包。先按排a[i]好序,然后倒叙多重背包。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
struct node
{
    int h,c,a;
}bag[401];
int cmp(const void *q,const void *b)
{
    return (*(struct node *)q).a > (*(struct node *)b).a ? 1:-1;
}
int p[401][40001],h[401],c[401],a[401];
int main()
{
    int i,n,j,max,k,mix;
    scanf("%d",&n);
    max = 0;
    for(i = 0;i <= n-1;i ++)
    {
        scanf("%d%d%d",&bag[i].h,&bag[i].a,&bag[i].c);
        if(max < bag[i].a)
        max = bag[i].a;
    }
    qsort(bag,n,sizeof(bag[0]),cmp);
    for(i = 0;i <= n-1;i ++)
    p[i][0] = 1;
    for(i = bag[0].h,j = 1;j <= bag[0].c;i += bag[0].h,j ++)
    {
        if(i > bag[0].a)
        break;
        p[0][i] = 1;
    }
    for(i = 1;i <= n-1;i ++)
    {
        for(j = max;j >= 0;j --)
        {
            if(p[i-1][j])
            {
                for(k = 1;k <= bag[i].c;k ++)
                {
                    if(j+k*bag[i].h > bag[i].a)
                    break;
                    p[i][j+k*bag[i].h] = 1;
                }
            }
        }
    }
    mix = 0;
    for(i = 0;i <= n-1;i ++)
    {
        for(j = 0;j <= max;j ++)
        {
            if(mix < j&&p[i][j])
            mix = j;
        }
    }
    printf("%d\n",mix);
    return 0;
}
posted @ 2012-08-18 14:25  Naix_x  阅读(135)  评论(0编辑  收藏  举报