• 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;
    }
  • 相关阅读:
    iOS 之 创建分类
    iOS 之 动画
    iOS 倒出spa文件 打包
    js闭包
    wampserver配置多站点
    js重定向
    php obstart
    php保存远程图片
    php获取前天的昨天的日期
    weixin js接口
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412263.html
Copyright © 2020-2023  润新知