您的位置:首页 > 其它

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

2009-12-22 09:22 531 查看
pku 2392 space elevator解题报告
算法:首先很容易想到先对3个测试数据的高度进行整体的排序(很显然,结果由最大的高度决定的);然后对每一组测试数据进行01背包dp.那么最优解就出来了。。

不过,我的算法要跑360多ms,我看到很多人都可以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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: