• POJ 2392 Space Elevator (DP)


    题意:

    有一头牛想要建一座石塔,他有很多不同类型的石块。
    每类石块有三个属性:1. (h): 石块的高度;2. (a): 石块能达到的最大高度;3. (c): 石块的数量

    思路:

    采用多重背包。
    注意点:在做背包前需要对石块能到达的最大高度(a)进行排序,防止石塔到了一定高度后,剩下的一些石块所能达到的最大高度小于这个高度,那剩下的这些石块也就不能往上放了。排序时按升序排序,先放能达到最大高度小的石块。

    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;  
    struct node  
    {  
        int h,a,c;  
    }x[505];  
    int dp[50005];  
    int cmp(node a,node b)  
    {  
        return a.a<b.a;//先按限制高度排序  
    }  
    int slove(int n)  
    {  
        sort(x,x+n,cmp);  
        memset(dp,0,sizeof(dp));  
        int ans=0;  
        for(int i=0;i<n;++i)   
        {  
            for(int j=x[i].a;j>=x[i].h;--j)  
            {  
                int num=min(x[i].c,j/x[i].h);//最大可使用数量  
                for(int k=0;k<=num;++k)  
                {  
                    int tp=dp[j-k*x[i].h]+k*x[i].h;  
                    if(x[i].a>=tp)//高度条件控制  
                    {  
                        dp[j]=max(tp,dp[j]);  
                    }  
                }  
                ans=max(ans,dp[j]);  
            }  
        }  
        return ans;  
    }  
    int main()  
    {  
        int n;   
        while(~scanf("%d",&n))  
        {  
            for(int i=0;i<n;++i)  
            {  
                scanf("%d%d%d",&x[i].h,&x[i].a,&x[i].c);  
            }  
            printf("%d
    ",slove(n));  
        }  
        return 0;  
    }
  • 相关阅读:
    第一次软工作业
    项目复审&事后诸葛亮分析
    测试与发布
    团队项目scrum冲刺日志合集
    团队作业3
    团队作业2
    团队作业1-团队展示&选题
    结对项目, 四则运算
    个人项目作业
    自我介绍+软工五问
  • 原文地址:https://www.cnblogs.com/demian/p/7373001.html
Copyright © 2020-2023  润新知