poj 2392 Space Elevator (多重背包)

来源:互联网 发布:奇兔刷机软件有毒 编辑:程序博客网 时间:2024/05/19 20:49
题意:一群牛要上太空,给出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;}



0 0
原创粉丝点击