poj[2392]space elevator

Description

The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000). 

Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.

Input

* Line 1: A single integer, K 

* Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.

Output

* Line 1: A single integer H, the maximum height of a tower that can be built

Sample Input

3
7 40 3
5 23 8
2 52 6

Sample Output

48

Hint

OUTPUT DETAILS: 

From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3. Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.

题解

题目大意:奶牛要去太空。为了实现这一目标,它们计划用k种石头建造一个高塔。每种石头有c个,每个高度为h,由于石头本身的质量问题,它们被放置的高度有一个限度,不能放在这一高度以上,记为a。求高塔可以达到的最大高度。
简单多重背包
#include<iostream>
#include<algorithm>
using namespace std;
int n;
bool f[40001];
struct block{
    int h,c,a;
    bool operator<(const block ano)const{
        return a<ano.a;
    }
}b[401];
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>b[i].h>>b[i].a>>b[i].c;
    sort(b+1,b+1+n);
    f[0]=1;
    for(int i=1;i<=n;i++)
        for(int k=1;k<=b[i].c;k++)
            for(int j=b[i].a;j>=k*b[i].h;j--)
                if(f[j-b[i].h])
                    f[j]=1;
    for(int j=40000;j>=0;j--)
        if(f[j]){
            cout<<j<<endl;
            break;
        }
    return 0;
}
原文地址:https://www.cnblogs.com/keshuqi/p/6131017.html