Space Elevator POJ - 2392
考察:多重背包dp
坑爹题目,敲半天代码发现题目意思都弄错了
这道题的ai 不是i木块的高度和不准超过ai 而是i木块在整个电梯的高度不允许超过ai 我还奇怪为什么题解都没累加答案....
这道题本蒟蒻不会用二进制优化..如果用了不知道怎么处理它属于哪个物品.
思路:
显而易见需要将木块按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 }
总结:
- 没有价值的题目感觉都能转化到可行性问题上