背景
广东汕头聿怀初中 Train#2 Problem4
描述
现有N种箱子,每种箱子高度H_i,数量C_i。现选取若干箱子堆成一列,且第i种箱子不能放在高度超过A_i的地方。试求最大叠放高度。
输入格式
第一行,一个整数,表示箱子种类N。
接下来N行,每行三个整数,表示H_i,A_i,C_i。
输出格式
一个整数,表示最大高度。
测试样例1
输入
3
7 40 3
5 23 8
2 52 6
输出
48
备注
N <= 400 , H_i <= 100 , C_i <= 10 , A_i <= 40000
Vivian Snow
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> using namespace std; int n,k,hc,h[1005],c[1005],a[1005],ans; bool f[40205]; struct ITM{ int h; int c; int a; }temp; bool cmp(ITM x,ITM y){ return x.a < y.a; } vector<ITM> itm; int main(){ cin>>n; for(int i = 1;i <= n;i++){ scanf("%d%d%d",&h[i],&a[i],&c[i]); k = 1; while(c[i] >= k){ temp.a = a[i]; temp.c = k; temp.h = h[i]; c[i] -= k; k <<= 1; itm.push_back(temp); } if(c[i]){ temp.a = a[i]; temp.c = c[i]; temp.h = h[i]; itm.push_back(temp); } } sort(itm.begin(),itm.end(),cmp); n = itm.size(); f[0] = true; for(int i = 0;i < n;i++){ hc = itm[i].h*itm[i].c; for(int j = itm[i].a;j >= itm[i].h;j--){ if(f[j-hc]) f[j] = true; if(f[j]) ans = max(ans,j); } } cout<<ans; return 0; }
时间: 2024-11-04 17:42:37