POJ 2392(Space Elevator)

题目链接:http://poj.org/problem?id=2392

题意:有n种石头,每个石头的高度hi,允许用的最高高度为ai,数量为ci,求能组合的最高高度。

思路:一道典型的完全背包问题,还是套路

 

 

ac 代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define MAX_N 40005
using namespace std;
typedef long long ll;

int k;
bool dp[MAX_N];

struct Block
{
	int h;
	int a;
	int c;
}block[405];

bool cmp(Block m,Block n){
	return m.a<n.a;
}

int main(void){
	while(~scanf("%d",&k)){
		for(int i=0;i<k;i++)
			scanf("%d%d%d",&block[i].h,&block[i].a,&block[i].c);
		sort(block,block+k,cmp);
		memset(dp,0,sizeof(dp));
		dp[0]=1;
		for(int i=0;i<k;i++)
			for(int j=0;j<block[i].c;j++)
				for(int s=block[i].a;s>=block[i].h;s--)
					dp[s]|=dp[s-block[i].h];

		for(int i=block[k-1].a;i>=0;i--)
			if(dp[i]){
				printf("%d\n",i);
				break;
			}
	}
	
	return 0;
}

  

posted @ 2020-04-12 16:42  ジャスミン  阅读(79)  评论(0编辑  收藏  举报