POJ 2392 Space Elevator

Space Elevator
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7150   Accepted: 3352

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
题目大意:有一群牛要上太空,他们计划建一个太空梯(用一些石头垒),他们有k种不同类型的石头,每一种石头的高度为h,数量为c,由于会受到太空辐射,每一种石头不能超过这种石头能够达到的最大高度a,求解利用这些石头所能修建的太空梯的最高的高度。
解题方法:多重背包,按照a从小到大对数据排序,然后用多重背包。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;

typedef struct
{
    int h;
    int a;
    int c;
}Stone;

int dp[40010];

bool cmp(const Stone &s1, const Stone &s2)
{
    return s1.a < s2.a;
}

int main()
{
    int K;
    Stone s[405];
    scanf("%d", &K);
    for (int i = 0; i < K; i++)
    {
        scanf("%d%d%d", &s[i].h, &s[i].a, &s[i].c);
    }
    sort(s, s + K, cmp);
    dp[0] = 1;
    for (int i = 0; i < K; i++)
    {
        for (int j = s[i].a; j >= 0; j--)
        {
            for (int k = 1; k <= s[i].c; k++)
            {
                if (j - s[i].h * k >= 0 && dp[j - s[i].h * k] != 0)
                {
                    dp[j] = 1;
                }
            }
        }
    }
    for (int i = 40010; i >=0; i--)
    {
        if (dp[i])
        {
            printf("%d
", i);
            break;
        }
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/lzmfywz/p/3235356.html