码迷,mamicode.com
首页 > 其他好文 > 详细

【动态规划/多重背包问题】POJ2392-Space Elevator

时间:2015-06-28 20:04:30      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

方法同POJ1014-Dividing,唯一不同点在于每一种block有最大限定高度a,故要以a为关键字进行排序,使得最大高度小的在前,否则最大高度小的再后可能放不上去。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>  
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 struct block
 9 {
10     int h,a,c;
11     bool operator < (const block& x) const
12     {
13         return a<x.a;
14     }    
15 };
16 
17 const int MAXN=40000+10;
18 int dp[MAXN]; 
19 block m[405];
20 int k,max=-1;
21 
22 int main()
23 {
24     scanf("%d",&k);
25     memset(dp,-1,sizeof(dp));
26     dp[0]=0;
27     int max=-1;
28     for (int i=0;i<k;i++) scanf("%d%d%d",&m[i].h,&m[i].a,&m[i].c);
29     sort(m,m+k);
30     for (int i=0;i<k;i++)
31     {
32         int a=m[i].a;
33         int h=m[i].h;
34         int c=m[i].c;
35         if (a>max) max=a;
36         for (int j=0;j<=a;j++)
37         {
38             if (dp[j]>=0) dp[j]=c;
39             else
40             {
41                 if (j<h || dp[j-h]<=0)  dp[j]=-1;
42                 else dp[j]=dp[j-h]-1; 
43             }
44         }
45     }
46     for (int i=max;i>=0;i--) if (dp[i]!=-1)
47     {
48         cout<<i<<endl;
49         break;
50     }
51     return 0;
52 }

【动态规划/多重背包问题】POJ2392-Space Elevator

标签:

原文地址:http://www.cnblogs.com/iiyiyi/p/4605963.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!