zoukankan      html  css  js  c++  java
  • luogu P1651 塔

    题目描述

    小明很喜欢摆积木,现在他正在玩的积木是由N个木块组成的,他想用这些木块搭出两座高度相同的塔,一座塔的高度是搭建它的所有木块的高度和,并且一座塔至少要用一个木块。每个木块只能用一次,也可以不用。目前已知每块木块的高度,小明想知道在最终两个塔的高度相同的情况下,他所能搭的塔的最大高度是多少,你能帮助他吗?

    输入输出格式

    输入格式:

    第一行为一个整数N,表示木块个数。

    第二行是N个整数,表示N块木块的高度。

    【数据规模】

    对于100%的数据,N≤50,每块木块的高度h满足1≤h≤500000,所有木块的高度总和≤500000。

    输出格式:

    仅一个整数,表示能搭建的塔的最大高度,若不能搭建两座相同高度的塔,则输出“-1”。

    输入输出样例

    输入样例#1: 复制
    3
    2 3 5
    输出样例#1: 复制
    5

    dp[i][j]表示在前i个数中取方块,差值为j时较高的高为多少
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn = 57;
    int n,thi[maxn];
    inline int read() {
        int x=0,    f=1;
        char c=getchar() ;
        while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar();};
        while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();
        return x*f;
    }
    int f[maxn][500007];
    int main() {
        n=read();int sum=0;
        memset(f,-2,sizeof(f));
        f[0][0]=0;
        for(int i=1;i<=n;++i) thi[i]=read(),sum+=thi[i];
        for(int i=1;i<=n;++i) {
            for(int j=0;j<=sum;j++) {
                f[i][j]=max(f[i][j],f[i-1][j]);//不放
                f[i][j+thi[i]]=max(f[i][j+thi[i]],f[i-1][j]+thi[i]);//放在高的上
                if(thi[i]<=j) f[i][j-thi[i]]=max(f[i][j-thi[i]],f[i-1][j]);//矮的还矮
                else f[i][thi[i]-j]=max(f[i][thi[i]-j],f[i-1][j]+thi[i]-j);//矮的变高
            }
        }
        printf("%d
    ",f[n][0]?f[n][0]:-1);
        return 0;
    }
  • 相关阅读:
    Charles下载和使用
    C# mvc读取模板并修改上传到web
    nginx 安装
    python 测试:wraps
    Linux下MySQL数据库常用基本操作 一
    myeclipse新建maven项目
    java 数据导入xls
    tomcat允许跨域请求:
    Import Projects from git
    c# DataTable 序列化json
  • 原文地址:https://www.cnblogs.com/sssy/p/7988519.html
Copyright © 2011-2022 走看看