tyvj1086 Elevator

背景

广东汕头聿怀初中 Train#2 Problem4

描述

现有N种箱子,每种箱子高度H_i,数量C_i。现选取若干箱子堆成一列,且第i种箱子不能放在高度超过A_i的地方。试求最大叠放高度。

输入格式

第一行,一个整数,表示箱子种类N。
接下来N行,每行三个整数,表示H_i,A_i,C_i。

输出格式

一个整数,表示最大高度。

测试样例1

输入


7 40 3 
5 23 8 
2 52 6

输出

48

备注

N <= 400 , H_i <= 100 , C_i <= 10 , A_i <= 40000
Vivian Snow
 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,k,hc,h[1005],c[1005],a[1005],ans;
bool f[40205];
struct ITM{
    int h;
    int c;
    int a;
}temp;
bool cmp(ITM x,ITM y){
    return x.a < y.a;
}
vector<ITM> itm; 
int main(){
    cin>>n;
    for(int i = 1;i <= n;i++){
        scanf("%d%d%d",&h[i],&a[i],&c[i]);
        k = 1;
        while(c[i] >= k){
            temp.a = a[i];
            temp.c = k;
            temp.h = h[i];
            c[i] -= k;
            k <<= 1;
            itm.push_back(temp);
        }
        if(c[i]){
            temp.a = a[i];
            temp.c = c[i];
            temp.h = h[i];
            itm.push_back(temp);
        }
    }
    sort(itm.begin(),itm.end(),cmp);
    n = itm.size();
    f[0] = true;
    for(int i = 0;i < n;i++){
        hc = itm[i].h*itm[i].c;
        for(int j = itm[i].a;j >= itm[i].h;j--){
            if(f[j-hc]) f[j] = true;
            if(f[j]) ans = max(ans,j);
        }
    }
    cout<<ans;
    return 0;
}

 

posted @ 2016-08-20 22:16  ACforever  阅读(188)  评论(0编辑  收藏  举报