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;
}
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;
}
相关文章推荐
- poj2392 Space Elevator(多重背包)
- POJ 2392 Space Elevator
- poj 2392 Space Elevator(多重背包变形)
- POJ 2392 Space Elevator 贪心+dp
- POJ 2392 Space Elevator
- poj 2392 Space Elevator
- poj 2392 Space Elevator
- POJ 2392 Space Elevator
- POJ 2392 Space Elevator(贪心+多重背包)
- POJ 2392 Space Elevator(贪心+多重背包)
- POJ 2392 Space Elevator (dp)
- poj 2392 space elevator
- POJ 2392 Space Elevator (多重背包问题)
- POJ - 2392 Space Elevator(多重背包)
- poj 2392 Space Elevator (多重背包)
- POJ 2392 Space Elevator(多重背包)
- POJ 2392 Space Elevator(多重背包)
- POJ 2392 Space Elevator
- poj 2392 Space Elevator(dp 排序+多重背包)
- POJ 2392 Space Elevator