您的位置:首页 > 其它

DP:Space Elevator(POJ 2392)

2015-11-05 01:31 489 查看
             


                  太空电梯

  题目大意:一群牛想造电梯到太空,电梯都是由一个一个块组成的,每一种块不能超过这个类型的高度,且每一种块都有各自的高度,有固定数量,问最高能造多高。

  这题就是1742的翻版,对ai排个序就可以了

  (尼玛,我qsort排了n-1个数,wa半天不知所措)

#include <iostream>
#include <functional>
#include <algorithm>

using namespace std;
typedef struct _set
{
int h_i;
int max_h;
int count;
}Block;
int fcomp(const void *a, const void *b)
{
return (*(Block *)a).max_h - (*(Block *)b).max_h;
}

static int dp[40005];
static Block B_Set[404];

void Search(const int);

int main(void)
{
int n;
while (~scanf("%d", &n))
{
if (n == 0) continue;
for (int i = 1; i <= n; i++)
scanf("%d%d%d", &B_Set[i].h_i, &B_Set[i].max_h, &B_Set[i].count);
qsort(B_Set, n + 1, sizeof(Block), fcomp);
Search(n);
}
return 0;
}

void Search(const int n)
{
int i, j;
memset(dp, -1, sizeof(dp));
dp[0] = 0;
for (i = 1; i <= n; i++)
{
if (B_Set[i].h_i == 0) continue;
for (j = 0; j < B_Set[i].h_i && j <= B_Set[i].max_h; j++)//先把前面的几个包确定下来
if (dp[j] != -1)
dp[j] = B_Set[i].count;
for (; j <= B_Set[i].max_h; j++)
{
if (dp[j] == -1)
{
if (dp[j - B_Set[i].h_i] <= 0)
continue;
else dp[j] = dp[j - B_Set[i].h_i] - 1;
}
else dp[j] = B_Set[i].count;
}
}
for (int i = B_Set
.max_h; i >= 0; i--)
{
if (dp[i] >-1)
{
printf("%d\n", i);
break;
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: