POJ-2392 Space Elevator 【動態規劃DP+多重揹包】
阿新 • • 發佈:2018-11-19
題目:牛要去太空了!他們計劃通過建造一種太空升降機來達到軌道:一個巨大的積木塔。他們有K (1 <= K <= 400)不同型別的積木來建造塔。型別i的每個塊的高度都是h_i (1 <= h_i <= 100),並且數量上都是c_i (1 <= c_i <= 10)。由於可能受到宇宙射線的破壞,i型塊的任何部分都不能超過最大高度a_i (1 <= a_i <= 40000)。按照規則,把積木堆在一起,幫助奶牛建造最高的太空電梯。輸出可建造的太空電梯的最高高度。
題解:首先按限制高度a_i從小到大排序,因為每種材料的限制高度不同,限制高度大的材料可以放在限制高度小的材料上面,而限制高度小的材料不能放在限制高度大的材料上面,然後多重揹包。dp[j]表示能否建造高度為j的太空電梯。
AC程式碼:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> using namespace std; #define io ios::sync_with_stdio(0),cin.tie(0) #define ms(arr) memset(arr,0,sizeof(arr)) #define inf 0x3f3f3f typedef long long ll; const int mod=1e9+7; const int maxn=6e4+7; int dp[maxn],k[maxn]; struct node { int h,c,a; }m[maxn]; int n; bool cmp (node x,node y) { return x.a<y.a; } int main() { io; cin>>n; for(int i=1;i<=n;i++) cin>>m[i].h>>m[i].a>>m[i].c; sort(m+1,m+1+n,cmp); ms(dp); dp[0]=1; int ans=0; for(int i=1;i<=n;i++) { ms(k); for(int j=m[i].h;j<=m[i].a;j++)//注意每種材料的限制高度不同 { if(dp[j]==0&&dp[j-m[i].h]==1&&k[j-m[i].h]<m[i].c) { dp[j]=1; k[j]=k[j-m[i].h]+1; ans=max(ans,j); } } } cout<<ans<<endl; return 0; }