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

方法同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 }

转载于:https://www.cnblogs.com/iiyiyi/p/4605963.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值