您的位置:首页 > 其它

poj 2392 Space Elevator

2011-06-18 18:00 323 查看
/*

Name: poj 2392 Space Elevator

Author: Unimen

Date: 11/05/2011 20:06

Description:多重背包

*/

/*

解题报告:多重背包

1、给限制的高度排序后即可转化为多重背包的模型

2、多重背包O(VN)的解法:先转化为完全背包,然后在循环的过程中,设置一个计数数组,计录

某个物品的使用次数即可。注:记录时有一个技巧,见注释

3、特别要注意上面的这种转化只能适用在体积与价值相等的多重背包情形下

*/

#include <iostream>

#include <cstring>

#include <algorithm>

#include <functional>

using namespace std;

struct Block

{

int h;

int a;

int c;

friend bool operator < (const Block &elem1, const Block &elem2)

{

return elem1.a < elem2.a;

}

};

Block blocks[410];

int used[40010];

int height[40010];

int k;

int main()

{

int i;

int j;

int temp;

while(cin>>k)

{

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

{

cin>>blocks[i].h>>blocks[i].a>>blocks[i].c;

}

sort(blocks, blocks+k, less<Block>());

//处理多重背包,弄成完全背包做

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

{

memset(used, 0, sizeof(used));

temp = 0;

for(j=blocks[i].h; j<=blocks[i].a; ++j)

{

temp = height[j-blocks[i].h]+blocks[i].h;

if(temp>height[j] && (used[j-blocks[i].h]<blocks[i].c)) //used为计录数组,并不是每次循环都要加1,注意理解多重背包循环的内部含义

{

height[j] = temp;

used[j] = used[j-blocks[i].h] + 1; //used计数的实现,包括上面的注释

}

}

}

int nMax = 0;

for(i=0; i<=blocks[k-1].a; ++i)

{

if(nMax < height[i])

nMax = height[i];

}

cout<<nMax<<endl;

}

return 0;

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