poj 动态规划DP - 2392 Space Elevator

背包九讲里面的多重背包问题。每一块积木有高度和数量,也有最大能到的高度位置限制。我们DP前首先要对高度限制进行排序,因为从直观角度说,我们也需要先处理较小的能到高度的积木,这样才能取到最大值。例如第一个高度是11,限制高度是100,第二个的限制高度是10,那如果直接处理,第二个不会被处理到。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define max(x,y)(x>y?x:y)
struct block
{
	int h;
	int a;
	int c;
};
struct block data[410];
int  dp[40010]={0};
int cmp(const void*p1,const void*p2)
{
return (*( block*)p1).a > (*( block*)p2).a?1:-1;
}
int main(){
	int k,i,j,m;
	scanf("%d",&k);
	for(i=0;i<k;i++){
		scanf("%d %d %d",&data[i].h,&data[i].a,&data[i].c);
	}
	qsort(data,k,sizeof(data[0]),cmp);
	memset(dp,0,sizeof(dp));
	for(i=0;i<k;i++){
		for(m=1;m<=data[i].c;m++)
			for(j=data[i].a;j>=data[i].h;j--)
				dp[j]=max(dp[j],dp[j-data[i].h]+data[i].h);
	}
	int ans=0;
	for(i=0;i<=data[k-1].a;i++) ans=max(ans,dp[i]);
	printf("%d\n",ans);
	return 0;
}



你可能感兴趣的:(动态规划,poj)