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;
}
算法:首先很容易想到先对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;
}
相关文章推荐
- pku 2057 The Lost House 树形dp+背包dp 解题报告
- pku 3039 Margaritas on the River Walk 背包dp 解题报告
- POJ 2392 Space Elevator [DP 多重背包]
- poj 2392 Space Elevator dp 多重背包
- Space Elevator POJ 2392 01背包/多重背包+二进制
- 四边形不等式优化dp应用------pku 1160 post office 解题报告
- pku 1185 炮兵阵地 压缩dp 解题报告
- poj Space Elevator 2392 (多重背包)
- pku 1953 dp World Cup Noise 解题报告
- 【解题报告】uva147_Dollars(美元, dp, 完全背包)
- POJ 2392 Space Elevator 多重背包
- 【解题报告】uva674_Coin Change(硬币找零, dp, 完全背包)
- POJ_2392_Space_Elevator_(动态规划,背包)
- poj 2392 (Space Elevator) 1276 (Cash Machine)变形背包
- Poj 2392 Space Elevator【多重背包】
- Space Elevator POJ 2392 01背包/多重背包+二进制
- POJ 2392 Space Elevator 排序+多重背包
- 最大报销额 (HDU 1864)解题报告(DP - 01 - 背包)
- pku 1163 dp TheTriangle 解题报告
- POJ 2392 Space Elevator 多重背包