Posted on 2010-08-05 11:05
Onway 阅读(351)
评论(0) 编辑 收藏 引用 所属分类:
伤不起的ACM
pku 2392 Space Elevator 多重背包
其实这个题找到了切入口后,是挺简单的。我似乎总有一种先入为主的倾向,想到一点点就下手,结果浪费时间,还掉入死胡同里。总之我是没找到那个切入口,然后看了一下discuss,原来排序就可以了,ft!!怎么我就笨得想不到了。其实我是想过排序,但没有深入去考虑。
整个题最后的解肯定是不大于最大高度的type的。
将最大高度排序后,先叠好高度低的,高度大的叠在上面。
每一高度只要能组合就行进标记,不再浪费后面的blocks。同时对于某一blocks,只要枚举高度到该type的最大高度即可,并记录改高度使用了该type的blocks的个数。(背包部分)
1
#include <iostream>
2
#include <algorithm>
3
using namespace std;
4
const int MAX=40000;
5
const int MMAX=400;
6
struct type
7

{
8
int h,a,c;
9
}data[MMAX+1];
10
bool cmp(type x,type y)
11

{
12
return x.a<y.a;
13
}
14
int cnt[MAX+1];
15
bool sgn[MAX+1];
16
int main()
17

{
18
int n,i,j;
19
scanf("%d",&n);
20
for(i=1;i<=n;++i) scanf("%d%d%d",&data[i].h,&data[i].a,&data[i].c);
21
sort(data+1,data+1+n,cmp);
22
23
memset(sgn,0,sizeof(sgn));
24
sgn[0]=1;
25
for(i=1;i<=n;++i)
26
{
27
memset(cnt,0,sizeof(cnt));
28
for(j=data[i].h;j<=data[i].a;++j)
29
if(!sgn[j]&&sgn[j-data[i].h]&&cnt[j-data[i].h]<data[i].c)
30
{
31
sgn[j]=1;
32
cnt[j]=cnt[j-data[i].h]+1;
33
}
34
}
35
36
for(j=data[n].a;j>=0;--j)
37
if(sgn[j])
38
39
break;
40
printf("%d\n",j);
41
return 0;
42
}