您的位置:首页 > 其它

POJ 2392 Space Elevator

2012-08-18 14:25 295 查看
题目链接

多重背包。先按排a[i]好序,然后倒叙多重背包。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
struct node
{
int h,c,a;
}bag[401];
int cmp(const void *q,const void *b)
{
return (*(struct node *)q).a > (*(struct node *)b).a ? 1:-1;
}
int p[401][40001],h[401],c[401],a[401];
int main()
{
int i,n,j,max,k,mix;
scanf("%d",&n);
max = 0;
for(i = 0;i <= n-1;i ++)
{
scanf("%d%d%d",&bag[i].h,&bag[i].a,&bag[i].c);
if(max < bag[i].a)
max = bag[i].a;
}
qsort(bag,n,sizeof(bag[0]),cmp);
for(i = 0;i <= n-1;i ++)
p[i][0] = 1;
for(i = bag[0].h,j = 1;j <= bag[0].c;i += bag[0].h,j ++)
{
if(i > bag[0].a)
break;
p[0][i] = 1;
}
for(i = 1;i <= n-1;i ++)
{
for(j = max;j >= 0;j --)
{
if(p[i-1][j])
{
for(k = 1;k <= bag[i].c;k ++)
{
if(j+k*bag[i].h > bag[i].a)
break;
p[i][j+k*bag[i].h] = 1;
}
}
}
}
mix = 0;
for(i = 0;i <= n-1;i ++)
{
for(j = 0;j <= max;j ++)
{
if(mix < j&&p[i][j])
mix = j;
}
}
printf("%d\n",mix);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: