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;
    }
  • 相关阅读:
    手打AC的第2道数位DP:BZOJ1799: [Ahoi2009]self 同类分布
    Oracle PL/SQL编程基础
    Oracle高级查询,事物,过程及函数
    缓存技术
    图形化报表
    网站配置与部署
    Oracle 空间管理
    Oracle 10g体系结构及安全管理
    ORACLE 数据库概述
    jQuery中的Ajax应用
  • 原文地址:https://www.cnblogs.com/sssy/p/7988519.html
Copyright © 2011-2022 走看看