jzoj 高中 1286——太空电梯

Description

  奶牛们想用K(1<=K<=400)中石块制造一个太空电梯去太空旅行,每种石块有自己的高度h_i(1<=h_i<=100)和数量c_i(1<=c_i<=10),为了避免宇宙射线的干扰,每种石块不能超过最高可以达到的高度a_i(1<=a_i<=40000)。
  帮助奶牛用石块堆积一个最高的太空电梯。

Input

  第1行:一个整数K
  第2到K+1行:每行3个用空格隔开的整数h_i,a_i,c_i

Output

  输出一个高度H,表示最大高度。

Sample Input

3
7 40 3
5 23 8
2 52 6

Sample Output

48


dp: 设f[j]为是否有高度为j这种情况,有则为1,没有则为0
开始将每种石块不能超过最高可以达到的高度,从小到大排序
然后三重循环枚举i,j,k;i枚举第i种石头;j枚举放i种石头的个数;k枚举可能到达的高度
状态转移方程:f[k]=f[k]|f[k-a[i].h] (‘|’的意思就是遇到两个0才为0,不然都为1)


代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=502;
struct zs{ int mx,c,h;}a[maxn];
bool f[40233];
int i,j,n,m,ans,k,nowc,nowh,nowmx;
int ra,fh;char rx;
bool cmp(zs a,zs b){return a.mx<b.mx;}
int main()
{
    scanf("%d",&n);f[0]=1;
    for(i=1;i<=n;i++) scanf("%d%d%d",&a[i].h,&a[i].mx,&a[i].c),ans=max(ans,a[i].mx);
    sort(a+1,a+1+n,cmp);
    for(i=1;i<=n;i++)
    {
                     nowc=a[i].c;
                     nowh=a[i].h;
                     nowmx=a[i].mx;
                     for(j=1;j<=nowc;j++) for(k=nowmx;k>=nowh;k--)f[k]=f[k]|f[k-nowh];
    }
    while(!f[ans]&&ans)ans--;
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Comfortable/p/8412263.html