zoukankan      html  css  js  c++  java
  • 11、堆砖块--2017网易春招

    [编程题] 堆砖块
    时间限制:1秒
    空间限制:32768K
    小易有n块砖块,每一块砖块有一个高度。小易希望利用这些砖块堆砌两座相同高度的塔。为了让问题简单,砖块堆砌就是简单的高度相加,某一块砖只能使用在一座塔中一次。小易现在让能够堆砌出来的两座塔的高度尽量高,小易能否完成呢。 
    输入描述:
    输入包括两行: 第一行为整数n(1 ≤ n ≤ 50),即一共有n块砖块 第二行为n个整数,表示每一块砖块的高度height[i] (1 ≤ height[i] ≤ 500000)
     
     
    输出描述:
    如果小易能堆砌出两座高度相同的塔,输出最高能拼凑的高度,如果不能则输出-1. 保证答案不大于500000。
     
    输入例子:
    3 2 3 5
     
    输出例子:
    5
     
    解题思路:
    用两堆砖块的高度差表示当前状态(唯一),dp值可以是较矮的砖块高度(或两堆砖块的高度和),因为知道了这两个数值就知道了各自的高度;      
    状态:d[i][j]代表前i块砖,高度差为j,矮的砖块高度;      
    状态转移:1:不放。d[i][j]=d[i-1][j];       
            2:放在矮的那堆,放上去后高度比原来高的矮。d[i][j]=d[i-1][j+a[i]]+a[i];       
            3:放在矮的那堆,放上去后高度比原来高的高。d[i][j]=d[i-1][a[i]-j]+a[i]-j;       
            4:放在高的那堆上  d[i][j]=d[i-1][j-a[i]];       
            初始化:d[0][i]=-1, d[0][0]=0 最后输出的时候要注意一下,如果结果为0,要输出-1
     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5  
     6 const int maxh=500000+5;
     7 int a[55];
     8 int d[2][maxh];
     9  
    10 int main()
    11 {
    12     int n;
    13     while(cin>>n)
    14     {
    15         int sum = 0;
    16         int a[n+1];
    17         for(int i=1;i<=n;i++)
    18         {
    19             cin>>a[i];
    20             sum+=a[i];
    21         }
    22         memset(d[0],-1,sizeof(d[0]));
    23         d[0][0]=0;
    24         for(int i=1;i<=n;i++)
    25         {
    26             for(int j=0;j<=sum;j++)
    27             {
    28                 d[i&1][j]=d[(i-1)&1][j];
    29                 if(j+a[i]<=sum && d[(i-1)&1][j+a[i]]>=0)
    30                     d[i&1][j]=max(d[i&1][j],d[(i-1)&1][j+a[i]]+a[i]);
    31                 if(a[i]-j>=0 && d[(i-1)&1][a[i]-j]>=0)
    32                     d[i&1][j]=max(d[i&1][j],d[(i-1)&1][a[i]-j]+a[i]-j);
    33                 if(j-a[i]>=0 && d[(i-1)&1][j-a[i]]>=0)
    34                     d[i&1][j]=max(d[i&1][j],d[(i-1)&1][j-a[i]]);
    35             }
    36         }
    37         if(d[n&1][0]==0)
    38             cout<<-1<<endl;
    39         else
    40             cout<<d[n&1][0]<<endl;
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    【算法】Manacher算法
    python 02 python入门知识
    python 01:计算机基础知识
    表示数值的字符串
    C++ 迭代器(STL迭代器)iterator详解
    构建乘积数组
    C++ 容器(STL容器)
    数组中重复的数字
    把字符串转换成整数
    十大经典排序算法
  • 原文地址:https://www.cnblogs.com/qqky/p/6939782.html
Copyright © 2011-2022 走看看