太空电梯
题目大意:
有n(1<=n<=400)种石头,每种石头有它的数量c(1<=c<=10),高度h(1<=h<=100),可搭到的最高高度a(1<=a<=40000),现在要将这些石头搭起来,每块石头不能超过自己可搭到的最高高度,问最高可以搭多高
Input
第一行一个数n
接下来n行,分别是h,a,c
Output
一个数,可以搭到多高
Sample Input
3
7 40 3
5 23 8
2 52 6
Sample Output
48
解题思路:
这就是排序+多重背包+二进制优化
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,hh,aa,cc,k,ans,f[40050];
struct rec
{int t,h;
}a[2005];
bool cmp(rec xx,rec yy)
{return xx.t<yy.t;
}
int main()
{scanf("%d",&m);for (int i=1;i<=m;++i)//二进制优化{scanf("%d %d %d",&hh,&aa,&cc);k=1;while (cc>k){a[++n].t=aa;//最高高度a[n].h=hh*k;//高度cc-=k;k*=2;}a[++n].t=aa;a[n].h=hh*cc;}f[0]=1;sort(a+1,a+1+n,cmp);//按最高高度从小到大排,让最高高度低的在下面for (int i=1;i<=n;++i)for (int j=a[i].t;j>=a[i].h;--j)//每一个高度if (f[j-a[i].h])//是否可以刚好达到这个高度{f[j]=1;//记录ans=max(ans,j);//求最高高度}printf("%d",ans);
}