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

                                                                 

题意:给出每块砖头的高度,限制海拔,数量,要求得到得到的最大高度~~~

思路:将各类型砖头的海拔从小到大排列,然后就是一个多重背包问题了~

CODE:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
const int inf=0xfffffff;
typedef long long ll;
using namespace std;

struct node
{
    int h,alt,n;
}block[405];
int dp[40004],num[40004];

bool cmp(node a,node b)
{
    return a.alt<b.alt;
}
int main()
{
    //freopen("in","r",stdin);
    int k;
    memset(dp,0,sizeof(dp));
    scanf("%d",&k);
    for(int i=0;i<k;i++){
        scanf("%d %d %d", &block[i].h, &block[i].alt, &block[i].n);
    }
    sort(block,block+k,cmp);
    dp[0]=1;
    for(int i=0;i<k;i++){
        memset(num,0,sizeof(num));
        for(int j=block[i].h; j<=block[i].alt; j++){
            if(dp[j-block[i].h] && dp[j]==0 && num[j-block[i].h]<block[i].n){
                num[j]=num[j-block[i].h]+1;
                dp[j]=1;
            }
        }
    }
    for(int i=block[k-1].alt;i>=0;i--){
        if(dp[i]) {
            printf("%d\n",i);
            break;
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值