POJ 2392 Space Elevator
http://poj.org/problem?id=2392
题意;有几种石块,每种有一定的数量,另外每种有一高度值a,并且每种石块的顶部离地面不能超过一定的高度
多重背包,再根据a值排序,与普通多重背包有点区别,而且dp[i]表示离地面为i时的最大高度
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #define nMAX 40005 using namespace std; int dp[nMAX],cnt; struct Block { int h,limit; }block[nMAX]; bool cmp(Block a,Block b) { return a.limit<b.limit; } int max(int a,int b) { return a>b?a:b; } int main() { int k,i,j,limit,num,h,up; while(~scanf("%d",&k)) { cnt=0; up=0; while(k--) { scanf("%d%d%d",&h,&limit,&num); up=max(up,limit); i=1; while(num>=i) { block[cnt].h=i*h; block[cnt].limit=limit; cnt++; num-=i; i*=2; } if(num){block[cnt].h=num*h,block[cnt].limit=limit,cnt++;} } sort(block,block+cnt,cmp); //for(i=0;i<cnt;i++)dp[i]=-999999; //dp[0]=0; memset(dp,0,sizeof(dp)); for(i=0;i<cnt;i++) for(j=block[i].limit;j>=block[i].h;j--) { dp[j]=max(dp[j],dp[j-block[i].h]+block[i].h); } int ans=0; for(i=0;i<=up;i++) ans=max(ans,dp[i]); printf("%d\n",ans); } return 0; }