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.
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.
* 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;
}