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;

}

你可能感兴趣的:(poj)