题目描述
奶牛们要去太空了!它们打算用方块建造一座太空电梯。
现在它们有 N 种方块,第 i 种方块有一个特定的高度 hi,一定的数量 ci 。
为了防止宇宙射线的破坏方块,第 i 种方块的任何部分不能超过高度 ai 。
请用这些方块堆出最高的太空电梯。
输入格式
第一行,一个整数 N;
第二行到 N+1 行,每行三个整数 hi, ai, ci ,数字之间用空格分隔。
输出格式
共一行,一个整数,为太空电梯的高度。
输入样例
3
7 40 3
5 23 8
2 52 6
输出样例
48
数据范围
对于 100% 的数据:1 ≤ N ≤ 400,1 ≤ hi ≤ 100,1 ≤ ci ≤ 10, 1 ≤ ai ≤ 4×104
题解
多重背包(优化1.0):
第
i
种方块只能在 ai 及以下的高度下使用,所以为了充分利用所有方块,需要以 ai 为关键字,从小到大排序。
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int h, a, c;
}s[410];
int n, f[40010];
bool cmp(node x, node y)
{
return x.a < y.a;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++) cin >> s[i].h >> s[i].a >> s[i].c;
sort(s + 1, s + n + 1, cmp);
f[0] = 1;
for (int i = 1; i <= n; i ++)
for (int j = s[i].a; j >= s[i].h; j --)
for (int k = 0; k * s[i].h <= j && k <= s[i].c; k ++)
f[j] += f[j - k * s[i].h];
for (int i = s[n].a; i >= 0; i --)
if(f[i])
{
cout << i << endl;
return 0;
}
}