poj 2392

  题意:有一群牛要上太空,他们计划建一个太空梯(用一些石头垒),他们有k种不同类型的石头,

每一种石头的高度为h,数量为c,由于会受到太空辐射,每一种石头不能超过这种石头的最大建造高度a,

求解利用这些石头所能修建的太空梯的最高的高度.

多重背包dp染色法。

代码:

#include<iostream>
#include<fstream>

using namespace std;

struct e{
	int h,a,c;
};

e map[401];

int dp[40001];
int c[40001];

int cmp(const void *a,const void *b){
	e *s=(e*)a;
	e *t=(e*)b;
	return s->a-t->a;
}
int n;


void read(){
//	ifstream cin("in.txt");
	int i,j,k,s;
	cin>>n;
	if(n==0)
	{
		cout<<0<<endl;
		return;
	}
	for(i=0;i<n;i++)
		cin>>map[i].h>>map[i].a>>map[i].c;
	qsort(map,n,sizeof(e),cmp);
	int res=0;
	dp[0]=1;
	for(i=0;i<n;i++)
	{
		memset(c,0,sizeof(c));
		for(j=map[i].h;j<=map[i].a;j++)
			if(dp[j-map[i].h]&&!dp[j]&&c[j-map[i].h]<map[i].c)
			{
				dp[j]=1;
				c[j]=c[j-map[i].h]+1;
			}
	}
	for(i=map[n-1].a;i>=0;i--)
		if(dp[i])
		{
			res=i;
			break;
		}
	cout<<res<<endl;

}

int main(){
	read();
	return 0;
}

posted on 2011-05-01 14:23  宇宙吾心  阅读(617)  评论(0)    收藏  举报

导航