Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8778 | Accepted: 4168 |
Description
Input
Output
Sample Input
3 7 40 3 5 23 8 2 52 6
Sample Output
48
Hint
From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3. Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.
题意:
给出k段高度为h,数量为c,并且高度不超过c的木块,求建造的最高的塔
题解:
肯定要先根据木块的最高高度c排序,然后用背包来解决。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=40000+100; int dp[maxn]; struct node { int h; int a; int c; }p[505]; bool cmp(node x,node y) { return x.a<y.a; } int main() { int n; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { scanf("%d%d%d",&p[i].h,&p[i].a,&p[i].c); } sort(p,p+n,cmp); memset(dp,0,sizeof(dp)); dp[0]=1; int ans=0; for(int i=0;i<n;i++) { for(int j=p[i].a;j>0;j--)//最高高度开始,不让前面的操作影响后面的 { for(int k=p[i].c;k>=0;k--)//使用的第i种木块不断增多,还可以用个count数组降低复杂度,此循环不要 { if(j-p[i].h*k>=0&&dp[j-p[i].h*k]) { ans=max(ans,j); dp[j]=1; } } } } printf("%d\n",ans); } return 0; }