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;
}
浙公网安备 33010602011771号