zoukankan      html  css  js  c++  java
  • 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;
    }
     
  • 相关阅读:
    hero
    今年暑假不AC
    Who's in the Middle
    A Simple Problem with Integers
    I hate it
    敌兵布阵
    Ordering Tasks
    Points on Cycle
    食物链
    c++ 14.0下载地址
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/3235356.html
Copyright © 2011-2022 走看看