Space Elevator POJ - 2392

原题链接

考察:多重背包dp

坑爹题目,敲半天代码发现题目意思都弄错了

这道题的ai 不是i木块的高度和不准超过ai 而是i木块在整个电梯的高度不允许超过a我还奇怪为什么题解都没累加答案....

这道题本蒟蒻不会用二进制优化..如果用了不知道怎么处理它属于哪个物品.

思路:

       显而易见需要将木块按a排序.因为用不了(不知道咋用) 二进制优化,所以我们可以考虑上一题的优化,最大高度转化为到此高度是否可行的问题.

       那么代码就可以直接将上一题的硬币修改一些(直接复制)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 const int N = 410,M = 40010;
 7 struct Block{
 8     int h,s,maxh;
 9     bool operator<(Block x){
10         return this->maxh<x.maxh;
11     }
12 }b[N];
13 bool f[M];
14 int used[M];
15 int main() 
16 {
17     int n;
18     scanf("%d",&n);
19     for(int i=1;i<=n;i++) scanf("%d%d%d",&b[i].h,&b[i].maxh,&b[i].s);
20     sort(b+1,b+n+1);
21     f[0] = 1;
22     for(int i=1;i<=n;i++)
23     {
24         memset(used,0,sizeof used);
25         for(int j=b[i].h;j<=b[i].maxh;j++)
26             if(!f[j]&&f[j-b[i].h]&&used[j-b[i].h]+1<=b[i].s) f[j] = 1,used[j] = used[j-b[i].h]+1;
27     }
28     for(int i=40000;i>=0;i--) if(f[i]) {printf("%d\n",i); break;} 
29     return 0;
30 }

 

总结:

  1. 没有价值的题目感觉都能转化到可行性问题上
posted @ 2021-02-03 17:17  acmloser  阅读(71)  评论(0编辑  收藏  举报