zoukankan      html  css  js  c++  java
  • POJ2392Space Elevator(贪心+背包)

    Space Elevator
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 9970   Accepted: 4738

    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.

    题意:奶牛想上太空给顶n种梯子,每种梯子对应三个值,a,h,c,a表示这种梯子必须在小于等于a的高度内使用,h表示它的高度,c表示这种梯子的个数。问内牛能够累出的最大高度。

    分析:根据a从小到大排序,然后对于每一个找到背包容量为a的最大高度,可以用01背包处理,对每一个奶牛的梯子作为一个物品,物品的种数就是c;当然也可以用多重背包解

    思路就是辣么简单就是没想出来,弱渣

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <cstdio>
     5 using namespace std;
     6 const int MAX = 50000;
     7 int dp[MAX];
     8 struct node
     9 {
    10     int h,a,c;
    11 };
    12 node cow[500];
    13 int cmp(node x, node y)
    14 {
    15     return x.a < y.a;
    16 }
    17 
    18 int main()
    19 {
    20     int k;
    21     while(scanf("%d", &k) != EOF)
    22     {
    23         for(int i = 0; i < k; i++)
    24         {
    25             scanf("%d%d%d",&cow[i].h,&cow[i].a,&cow[i].c);
    26         }
    27         memset(dp,0,sizeof(dp));
    28         sort(cow, cow + k, cmp);
    29         for(int i = 0; i < k; i++)
    30         {
    31             for(int t = 1; t <= cow[i].c; t++)
    32             {
    33                 for(int j = cow[i].a; j >= cow[i].h; j--)
    34                 {
    35                     if(dp[j] <= cow[i].a && dp[j - cow[i].h] + cow[i].h <= cow[i].a)
    36                     dp[j] = max(dp[j], dp[j - cow[i].h] + cow[i].h);
    37                 }
    38             }
    39         }
    40         int ans = 0;
    41         for(int i = 1; i <= cow[k - 1].a; i++)  //这一步还是在斌神那里得到的提示,太弱了
    42             ans = max(ans, dp[i]);
    43         printf("%d
    ", ans);
    44     }
    45     return 0;
    46 }
    View Code
  • 相关阅读:
    js验证邮箱
    输出一个金字塔
    仿QQ聊天软件2.0版
    zoj 3662 第37届ACM/ICPC长春赛区H题(DP)
    zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)
    zoj 3640 概率dp
    hdu 5203 && BC Round #37 1002
    poj 3071 概率dp
    poj 2151 概率dp
    zoj 3460 二分+二分图匹配
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5049430.html
Copyright © 2011-2022 走看看