pku 2392 space elevator 多重背包 dp 解题报告

来源:互联网 发布:dnd跑团规则数据 编辑:程序博客网 时间:2024/05/17 06:20

pku 2392 space elevator解题报告

算法:首先很容易想到先对3个测试数据的高度进行整体的排序(很显然,结果由最大的高度决定的);然后对每一组测试数据进行01背包dp.那么最优解就出来了。。

 

不过,我的算法要跑360ms,我看到很多人都可以0ms,在这问问那些牛人了,怎么达到0ms?

 

AC代码:

#include <stdio.h>

#include <string.h>

#include <algorithm>

#define M 405

#define N 40005

#define max(a, b) (a > b ? a : b)

 

int n, dp[N];

typedef struct number

{

       int a;

       int h;

       int c;

}Number;

Number data[M];

 

int cmp(const void *a, const void *b)

{

       return (*(number *)a).a > (*(number *)b).a ? 1 : -1;

}

 

int main()

{

       //freopen("elevator.11.in", "r", stdin);

       int i, j, k, C, max;

 

       scanf("%d", &n);

       for (i = 0, max = 0; i < n; i++)

       {

              scanf("%d%d%d", &data[i].h, &data[i].a, &data[i].c);

              if (max < data[i].a)

              {

                     max = data[i].a;

              }

       }

       int ans = 0;

       qsort(data, n, sizeof(data[0]), cmp);

       for (i = 0; i <= max; i++)

       {

              dp[i] = 0;

       }

       for (i = 0; i < n; i++)

       {

              C = data[i].a;

              for (j = 0; j < data[i].c; j++)

              {

                     for (k = C; k >= data[i].h; k--)

                     {

                            dp[k] = max(dp[k], dp[k - data[i].h] + data[i].h);

                            if (dp[k] > ans)

                            {

                                   ans = dp[k];

                            }

                     }

              }

       }

       printf("%d/n", ans);

 

       return 0;

}