刷题——Space Elevator POJ

来源:互联网 发布:电商 用户数据指标 编辑:程序博客网 时间:2024/06/03 03:56
/*
给定一些建筑块,问用这些建筑块能搭建多高的建筑
每个建筑块有一定的高度h,和最高能搭建高度a,和块数c


很明显的这是一个背包问题,背包容量不超过40000
现在也就是求在限制范围中所能搭建的最大高度
dp[i]表示i这个高度是否能达到
那么dp[i]={
            -1:不能达到
            0:能达到,dp[i-e[i].h*d]=0,d[1,e[i].c]
}
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct node{int h,a,c;};
node e[405];
bool cmp(node a,node b){
    return a.a<b.a;
}
int dp[40005];
int use[40005];
int main(){
    int k;
    while(~scanf("%d",&k)){
        for(int i=0;i<k;i++){
            scanf("%d %d %d",&e[i].h,&e[i].a,&e[i].c);
        }
        sort(e,e+k,cmp);
        memset(dp,-1,sizeof(dp));
        dp[0]=0;
        int maxx=0;
        for(int i=0;i<k;i++){
            memset(use,0,sizeof(use));
            for(int j=e[i].h;j<=e[i].a;j++){
                if(dp[j]==-1&&dp[j-e[i].h]==0&&use[j-e[i].h]+1<=e[i].c){
                    dp[j]=0;
                    use[j]=use[j-e[i].h]+1;
                    if(j>maxx){
                        maxx=j;
                    }
                }
            }
        }
        printf("%d\n",maxx);
    }
    return 0;
}
原创粉丝点击