POJ 2392 스페이스 엘리베이터 [DP 멀 티 백 팩]

제목:
n 가지 벽돌 을 주 고 모든 벽돌 은 c 개 이 며 높이 는 w 이 며 h 높이 에서 사용 할 수 있 습 니 다.
어떻게 누적 하면 총 높이 를 가장 높 일 수 있 는 지 물 었 다.
생각:
h 고도 의 제약 이 없다 면 분명히 전부 더 하면 된다.
dp 로 해결 합 니 다. 모든 높이 j 는 상태 입 니 다.그래서 본질은 가방 문제 예요.
각 벽돌 은 유한 개 이기 때문에 다 중 가방 입 니 다.이 진 으로 시간 을 최적화 하 다.
그러나 h 고도 제약 문제 로 인해 모든 상태 j 는 고도 제약 h > = j 의 벽돌 과 관련 이 있 을 수 있 습 니 다.
그 러 니까 h 높이 에서 작은 것 부터 큰 것 까지 정렬 한 다음 에 dp.
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cmath>
#include<algorithm>
#define llong long long
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
#define Abs(a) ((a)>0?(a):-(a))
#define Mod(a,b) (((a)-1+(b))%(b)+1)
using namespace std;
int n,m;
const int N=7005;
const int M=40005;
const int inf=99999999;
int dp[M];
struct Node
{
	int w,h;  
}node[N];
bool cmp(const Node &a,const Node &b)
{
	return a.h<b.h;
}
void solve()
{
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=n;i++)
	{
		for(int j=node[i].h;j>=node[i].w;j--)
		{
			dp[j]=Max(dp[j],dp[j-node[i].w]+node[i].w);
		}
	}
	int ans=0;
	for(int i=1;i<=node[n].h;i++)
		ans=Max(ans,dp[i]);
	printf("%d
",ans); } int main() { int tmp,a,b,c; n=0; scanf("%d",&tmp); for(int i=1;i<=tmp;i++) { scanf("%d%d%d",&a,&b,&c); for(int j=1;c;j*=2) { n++; node[n].h=b; if(j<=c) { node[n].w=a*j; c-=j; } else { node[n].w=a*c; c=0; } } } sort(node+1,node+1+n,cmp); solve(); return 0; }

좋은 웹페이지 즐겨찾기