您的位置:首页 > 其它

Space Elevator poj 2392(多重背包)

2016-06-25 21:08 281 查看
问题描述

The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has
height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000).

Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.

输入

* Line 1: A single integer, K

* Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.

输出

* Line 1: A single integer H, the maximum height of a tower that can be built

样例输入

3
7 40 3
5 23 8
2 52 6


样例输出

48

先按照ai的大小排序然后就是完全背包了。
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int dp[40002];int sum[40002];
struct node
{
int h,c,a;
}no[402];

bool operator<(node a,node b)
{
return a.a<b.a;
}

int main()
{
int n;
scanf("%d",&n);
int maxx=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&no[i].h,&no[i].a,&no[i].c);
maxx=max(maxx,no[i].a);
}
sort(no+1,no+n+1);
int ans=0;
for(int i=1;i<=n;i++)
{
dp[0]=1;
memset(sum,0,sizeof(sum));
for(int j=no[i].h;j<=no[i].a;j++)
if(!dp[j]&&dp[j-no[i].h]&&sum[j-no[i].h]<no[i].c)
{
dp[j]=1;
sum[j]=sum[j-no[i].h]+1;
ans=max(ans,j);
}
}
printf("%d\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: