| | | | 背景 Background | | | 广东汕头聿怀初中 Train#2 Problem4
| | | |
| | | | 描述 Description | | | 现有N种箱子,每种箱子高度H_i,数量C_i。现选取若干箱子堆成一列,且第i种箱子不能放在高度超过A_i的地方。试求最大叠放高度。
| | | |
| | | | 输入格式 Input Format | | | 第一行,一个整数,表示箱子种类N。 接下来N行,每行三个整数,表示H_i,A_i,C_i。
| | | |
| | | | 输出格式 Output Format | | | 一个整数,表示最大高度。
| | | |
| | | | 样例输出 Sample Output [复制数据] | | | | | | |
| | | | 注释 Hint | | | N <= 400 , H_i <= 100 , C_i <= 10 , A_i <= 40000
| |
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
int a,h,c;
};
Node data[500];
bool f[50000];
bool cmp(Node x,Node y)
{
return x.a<y.a;
}
int main()
{
int n;
while(scanf("%d",&n)==1)
{
memset(f,0,sizeof(f));f[0]=1;
for(int i=0;i<n;i++) scanf("%d%d%d",&data[i].h,&data[i].a,&data[i].c);
sort(data,data+n,cmp);//按照最大高度排序
for(int i=0;i<=n;i++)
{
for(int j=1;j<=data[i].c;j++)
{
for(int k=data[i].a;k>=data[i].h;k--)//每个箱子的高度范围是h[i]~A[i]
{
if(f[k-data[i].h]) f[k]=1;
}
}
}
int cnt=-1;
for(int i=50000-1;i>=0;i--)
{
if(f[i])
{
cnt=i;
break;
}
}
printf("%d/n",cnt);
}
return 0;
}