poj 2392 Space Elevator (多重背包)

题意:一群牛要上太空,给出n种石块,每种石块给出单块高度,总高度不能超过的最大值,数量,要求
用这些石块能组成的最大高度
思路:在进行多重背包之前要进行一次排序,将最大高度小的放在前面,只有这样才能得到最优解,如果
将大的放在前面,后面有的小的就不能取到,排序之后就可以进行多重背包了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct node
{
    int h,a,c;
}k[410];
int used[400000];
int dp[400000];

bool cmp(node x,node y)
{
    return x.a<y.a;
}

int main()
{
    int n,ans;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d%d%d",&k[i].h,&k[i].a,&k[i].c);
        sort(k,k+n,cmp);
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        ans=0;
        for(int i=0;i<n;i++)
        {
            memset(used,0,sizeof(used));
            for(int j=k[i].h;j<=k[i].a;j++)
            {
                if(!dp[j] && dp[j-k[i].h] && used[j-k[i].h]<k[i].c)
                {
                    dp[j]=1;
                    used[j]=used[j-k[i].h]+1; //计算所用石头个数
                    if(j>ans)
                        ans=j;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}



poj 2392 Space Elevator (多重背包)

上一篇:UVA 10158 并查集的经典应用


下一篇:verilog中inout的定义问题