【动态规划/多重背包问题】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 }
时间: 2024-10-24 08:53:37

【动态规划/多重背包问题】POJ2392-Space Elevator的相关文章

动态规划_多重背包:Space Elevator

U - Space Elevator Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have

【动态规划/多重背包问题】POJ1014-Dividing

多重背包问题的优化版来做,详见之前的动态规划读书笔记. dp[i][j]表示前i中数加得到j时第i种数最多剩余几个(不能加和得到i的情况下为-1)递推式为: dp[i][j]=mi(dp[i-1][j]≥0,即前i-1种数就能达到数字j) =-1(j<ai 或者 dp[i][j-ai]≤0,即再加上一个第i种数也无法达到j 或者 当前和小于当前数) =dp[i][j-ai]-1(可以达到的情况) #include<iostream> #include<cstdio> #inc

动态规划-多重背包问题

0-1背包问题 完全背包问题 多重背包问题是0-1背包问题和完全背包问题的综合体,可以描述如下:从n种物品向容积为V的背包装入,其中每种物品的体积为w,价值为v,数量为k,问装入的最大价值总和? 我们知道0-1背包问题是背包问题的基础,所以在解决多重背包问题的时候,要将多重背包向0-1背包上进行转换.在多重背包问题中,每种物品有k个,可以将每种物品看作k种,这样就可以使用0-1背包的算法.但是,这样会增加数据的规模.因为该算法的时间复杂度为O(V*∑ni=1ki),所以要降低每种物品的数量ki.

POJ 2392 Space Elevator(贪心+多重背包)

POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木,每种积木都有一个高度h[i],一个数量num[i],还有一个限制条件,这个积木所在的位置不能高于limit[i],问能叠起的最大高度? 分析: 本题是一道多重背包问题, 不过每个物品的选择不仅仅要受该种物品的数量num[i]限制, 且该物品还受到limit[i]的限制. 这里有一个贪心的结论: 我们每次背包选取物品时都应该优先放置当前limi

poj 2392 Space Elevator (多重背包)

Space Elevator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8110   Accepted: 3843 题目大意  :一群牛要上天  用一些石块堆塔  给出石块的种类  及其每个种类的数量 和该种石块能出现的最高高度  和每种石块的数量 求怎么摆放才能堆得最高 多重背包模板题.... 将所有石块排序  把高度低的放下面 #include<iostream> #include<cstdio>

POJ 2392 Space Elevator(多重背包)

Description The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h

动态规划第二讲——完全背包与多重背包问题

上一节,我们讨论了01背包问题,说明了*递归与分治法 与 动态规划DP的区别和联系,介绍了缓存的概念*.以下,我们用DC.DP.cache分别表示分治法.动态规划和缓存.本节,我们讨论01背包的另外两种形似-- 完全背包和多重背包问题,分析DP问题的另外一些情况. 例一:完全背包问题 同样有n种价值和重量分别为weight[i] and value[i], 背包大小W.限制条件:每种物品数目是无限的.问:能挑选出来的总价值最大的物品组合总重量? 分析一:这里,我们无视数量有限这个条件,可以得到下

【动态规划】多重背包问题

说明 前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题--多重背包. 这个背包,听起来就很麻烦的样子.别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟. 如果没有看过前两篇01背包和完全背包的文章,强烈建议先阅读一下,因为本文跟前两篇文章关联性很强. 多重背包 有N种物品和一个容量为T的背包,第i种物品最多有M[i]件可用,价值为P[i],体积为V[i],求解:选哪些物品放入背包,可以使得这些物品的价值最大,并且体积总和不超过背包容量. 对比一下完全背包,其实只是多了一

poj 2392 Space Elevator(多重背包+先排序)

Description The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h