POJ 2392 Space Elevator(多重背包,排序)

mac2022-06-30  130

 

POJ 2392 Space Elevator 题意:解题过程:AC代码:

 

POJ 2392 Space Elevator

题目传送门

题意:

你需要建一个高塔,材料总共有K种,每种材料有三个属性:高度,数量,限度。限度是指该种材料只能在低于该限度的高度下被使用。问你最高能够把这个高塔建到多高。

解题过程:

这题中材料有高度和数量,比较容易的想到这题是一道多重背包的题目,但是这题有一个限度的限制,使得一些材料在一定高度以上就不能使用,所以我们可以对材料按限度排序,然后就是朴素的多重背包加上一些非法方案的去除就行了。

AC代码:

#pragma GCC optimize (3) #include <cstdio> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <set> #include <map> #include <list> #include <vector> #include <cstdlib> #include <cstring> using namespace std; const int maxn=500; int n; struct mat { int h,a,c; }m[maxn]; bool f[50005]; bool cmp(mat x,mat y) { return x.a<y.a; } int main() { scanf("%d",&n); int ttop=-1; for(int i=1;i<=n;i++) { scanf("%d%d%d",&m[i].h,&m[i].a,&m[i].c); ttop=max(ttop,m[i].a); } sort(m+1,m+1+n,cmp); f[0]=1; for(int i=1;i<=n;i++) { int top=m[i].a; for(int j=top;j>=0;j--) { if(!f[j])continue; for(int k=1;k<=m[i].c;k++) { int t=j+k*m[i].h; if(t<=m[i].a)f[t]=1; } } } for(int i=ttop;i>=0;i--) { if(f[i]) { printf("%d\n",i); return 0; } } }

本人蒟蒻OIer一枚,欢迎加QQ:840776708一起学习蛤。

转载于:https://www.cnblogs.com/Apocrypha/p/9433664.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)