poj 2392 Space Elevator 背包
2013-04-14 19:38
288 查看
这个题目本质上是一个多重背包
但是有一个限制条件,就是每个物品堆放的高度都有一个最大值,不能超过
刚开始被这个条件吓到了,考虑到用搜索的做法,但是400件物品,搜索无法承受
就又回到dp上面,其实贪心的思想就可以保证最优,那些堆放高度限制低的物品一定是放在底下的
所以先按堆放高度限制升序排序,然后就可以上多重背包了
多重背包的解法:用二进制的思想来拆分物品,使之转化成01背包
#include
#include
#include
using namespace std;
int a[4001][2],lon=0;
int ans[400001];
int max(int a,int b)
{
if(a>b)
return(a);
return(b);
}
int min(int a,int b)
{
if(a
return(b);
}
int main()
{
int k;
scanf("%d",&k);
for(int
i=1;i<=k;i++)
{
int h,l,c;
scanf("%d %d %d",&h,&l,&c);
int tmp=1;
while(tmp<=c)
{
c-=tmp;
a[++lon][0]=tmp*h;
a[lon][1]=l;
tmp*=2;
}
if(c)
{
a[++lon][0]=c*h;
a[lon][1]=l;
}
}
// for(int
i=1;i<=lon;i++)
// printf("%d
%d\n",a[i][0],a[i][1]);
for(int i=1;i<=lon;i++)
for(int j=lon;j>=i+1;j--)
if(a[j][1]
{
int tmp=a[j-1][0];
a[j-1][0]=a[j][0];
a[j][0]=tmp;
tmp=a[j-1][1];
a[j-1][1]=a[j][1];
a[j][1]=tmp;
}
memset(ans,0,sizeof(ans));
ans[0]=1;
int
lonh=0;
for(int
i=1;i<=lon;i++)
{
for(int j=min(lonh,a[i][1]-a[i][0]);j>=0;j--)
if(ans[j])
{
//
printf("%d %d\n",j+a[i][0],a[i][0]);
ans[j+a[i][0]]=1;
lonh=max(j+a[i][0],lonh);
}
}
for(int
i=400001;i>=0;i--)
if(ans[i])
{
printf("%d\n",i);
break;
}
return
0;
}
但是有一个限制条件,就是每个物品堆放的高度都有一个最大值,不能超过
刚开始被这个条件吓到了,考虑到用搜索的做法,但是400件物品,搜索无法承受
就又回到dp上面,其实贪心的思想就可以保证最优,那些堆放高度限制低的物品一定是放在底下的
所以先按堆放高度限制升序排序,然后就可以上多重背包了
多重背包的解法:用二进制的思想来拆分物品,使之转化成01背包
#include
#include
#include
using namespace std;
int a[4001][2],lon=0;
int ans[400001];
int max(int a,int b)
{
if(a>b)
return(a);
return(b);
}
int min(int a,int b)
{
if(a
return(b);
}
int main()
{
int k;
scanf("%d",&k);
for(int
i=1;i<=k;i++)
{
int h,l,c;
scanf("%d %d %d",&h,&l,&c);
int tmp=1;
while(tmp<=c)
{
c-=tmp;
a[++lon][0]=tmp*h;
a[lon][1]=l;
tmp*=2;
}
if(c)
{
a[++lon][0]=c*h;
a[lon][1]=l;
}
}
// for(int
i=1;i<=lon;i++)
// printf("%d
%d\n",a[i][0],a[i][1]);
for(int i=1;i<=lon;i++)
for(int j=lon;j>=i+1;j--)
if(a[j][1]
{
int tmp=a[j-1][0];
a[j-1][0]=a[j][0];
a[j][0]=tmp;
tmp=a[j-1][1];
a[j-1][1]=a[j][1];
a[j][1]=tmp;
}
memset(ans,0,sizeof(ans));
ans[0]=1;
int
lonh=0;
for(int
i=1;i<=lon;i++)
{
for(int j=min(lonh,a[i][1]-a[i][0]);j>=0;j--)
if(ans[j])
{
//
printf("%d %d\n",j+a[i][0],a[i][0]);
ans[j+a[i][0]]=1;
lonh=max(j+a[i][0],lonh);
}
}
for(int
i=400001;i>=0;i--)
if(ans[i])
{
printf("%d\n",i);
break;
}
return
0;
}
相关文章推荐
- poj&nbsp;2392&nbsp;Space&nbsp;Elevator(多重背包…
- poj_2392_Space Elevator & poj_1742_Coins 一种多重背包
- poj 2392 Space Elevator 二进制拆包多重背包
- T - Space Elevator poj-2392(多重背包)
- poj&nbsp;1014&nbsp;Dividing(多重背包)
- POJ2392-Space Elevator-多重背包
- POJ 2392 Space Elevator 多重背包
- poj 2392 Space Elevator(未优化的多重背包)
- POJ 2392 Space Elevator 背包题解
- poj&nbsp;1276&nbsp;Cash&nbsp;Machine(多重背包…
- POJ 2392 Space Elevator 多重背包
- poj 2392 Space Elevator dp 多重背包
- poj&nbsp;3211&nbsp;Washing&nbsp;Clothes&nbsp;背包
- POJ Space Elevator(排序+多重背包)
- poj&nbsp;3624&nbsp;Charm&nbsp;Bracelet(0/1背包)
- POJ 2392 Space Elevator 排序+多重背包
- poj Space Elevator 2392 (多重背包)
- ACM: 动态规划题 poj 3211 背包变…
- poj 2392 (Space Elevator) 1276 (Cash Machine)变形背包
- Space Elevator poj 2392(多重背包)