18.03.12 vijos1037搭建双塔

描述

2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔。

Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建。但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少。所以他来请你帮忙。

给定水晶的数量N(1≤N≤100)和每块水晶的高度Hi(N块水晶高度的总和不超过2000),你的任务是判断Mr. F能否用这些水晶搭建成一座双塔(两座塔有同样的高度),如果能,则输出所能搭建的双塔的最大高度,否则输出“Impossible”。

格式

输入格式

输入的第一行为一个数N,表示水晶的数量。第二行为N个数,第i个数表示第i个水晶的高度。

输出格式

输出仅包含一行,如果能搭成一座双塔,则输出双塔的最大高度,否则输出一个字符串“Impossible”。

样例1

样例输入1

5
1 3 4 5 2

样例输出1

7

来源

某校NOIP模拟题

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <math.h>
 4 #include <string.h>
 5 #include <cstdio>
 6 #include <stdlib.h>
 7
 8 using namespace std;
 9
10 int f[4002][4002];//f[x][y]为一座塔为x 一座塔为y时能不能搭起来的判断值
11
12 int main()
13 {
14     int n,h[102]={0},sum=0;
15     cin>>n;
16     for(int i=1;i<=n;i++)
17     {
18         scanf("%d",&h[i]);
19         sum+=h[i];
20     }
21     f[0][0]=1;
22     for(int c=1;c<=n;c++)
23         for(int i=sum;i>=0;i--)
24             for(int j=sum;j>=0;j--)
25             {
26                 if(f[i][j])
27                 {
28                     f[i+h[c]][j]=1;
29                     f[i][j+h[c]]=1;
30                 }
31             }
32     for(int i=sum;i>=1;i--)
33         if(f[i][i])
34         {
35             printf("%d\n",i);
36             return 0;
37         }
38     printf("Impossible\n");
39     return 0;
40 }

状态方程(是叫这个吗?)f[x][y]纪录两座塔能否分别堆成x高y高,能的话存1,不能存0

思路:水晶挨个放到塔上,在现有的已经证明可以堆出的塔的高度的基础上,在两座塔上分别加上这个水晶,加完后两座塔的高度也是可以堆出的,更新f中对应的值。

缺点是重复浪费很多导致这个算法很慢,题解中有很多大佬有其他的方法和优化,先放着吧。

原文地址:https://www.cnblogs.com/yalphait/p/8549560.html

时间: 2024-10-09 19:21:16

18.03.12 vijos1037搭建双塔的相关文章

Docker 18.03私有仓库搭建

我们在使用Docker时 下载镜像一般都是在外网下载并使用.可是当我们没有外网时我们不得不自己搭建私有仓库.流程图:docker 版本[[email protected] ~]# docker versionClient:Version: 18.03.1-ceAPI version: 1.37Go version: go1.9.5Git commit: 9ee9f40Built: Thu Apr 26 07:20:16 2018OS/Arch: linux/amd64Experimental:

&lt;模电学习1&gt;Multisim 12.0 搭建并仿真51单片机最小系统

环境: 系统环境: win7 64位 软件平台:Multisim 12.0 目的: 刚毕业,但是模电知识也忘得差不多了,加之自己想搞搞硬件设计,如果只是看模电书,不实践,还是终觉浅.当做兴趣一样学学模电,仿真仿真.Multisim的MCU少,就拿51来练练手,搭建51单片机仿真系统,配合着记录一下书本的知识. 概述: 最后使用Multisim 12.0搭建出来的最小系统为图1-1所示,通过编写程序可以使LED1循环闪烁. 图1-1 正常来说,51单片机最小系统一般包括单片机.晶振电路.复位电路,

UnitSelector.ONDA.18.03.08 1CD+AutoDesSys form.Z pro v8.6.3.1 32&amp;64

Survey CAD System pfCAD agriCAD v4.0.40 农业绘图和设计软件Agricad PC提供农业绘图和设计工作的工具. 它是在CAD环境中开发的,主要功能是: 映射管理边界的验证和控制使用Supertrack进行工作的可视化和打印葡萄园和果园的设计枢轴灌溉设计泥浆扩散作业的管理 SynaptiCAD Product Suite 20.31 电子电路设计自动化软件使用SynaptiCAD工具,您可以开始分析和模拟设计思路,而无需完成整个电路或模型模型. Synapti

UBUNTU SERVER 12.04搭建PHP环境

Ubuntu的Server和Desktop上都配过php的LAMP环境,步骤没什么区别,相关的教程网上也很多,这里把自己的配置过程记录下来,省得每次都google…供参考 整个环境用到Apache2.MySQL.php5和phpMyAdmin 1.安装Apache2 $ sudo apt-get install apache2 装完后在浏览器中访问 http://[server-ip-address]  如看到类似下图的页面,则apache2安装成功 Ubuntu下,apache的配置信息在/e

Ubuntu 12.04 搭建 Eclipse Android 开发环境(转)

Ubuntu 12.04 搭建 Eclipse Android 开发环境 http://blog.sina.com.cn/s/blog_93dc666c0101b39p.html (2012-09-07 00:40:48) 转载▼ 标签: ubuntu android linux eclipse it 分类: Linuxubuntu 一,安装32位库 1. 如果 linux 是 64 位的,不安装 32 位库,会导致无法创建 Android 模拟器. $sudo apt-get install

Ubuntu 12.04搭建MTK 安卓开发环境

MTK+Android开发(66)  Ubuntu 12.04搭建 MTK 6577安卓开发环境 1.       下载并安装Vmware虚拟机: 2.       下载并在虚拟机上安装Ubuntu 12.04 iso 安装包:下载地址: http://releases.ubuntu.com/12.04/ : 3.       更新Ubuntu 源: ①     sudo cp /etc/apt/sources.list /etc/apt/source.list.bak ②     sudo g

shu_1299 vijos 1037(搭建双塔)

http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=7 分析: 经典DP题 dp[ i ][ j ]:前i个水晶搭建的高度差为 j 的双塔中较高塔的高度: dp[ i ][ j ] = d[ i-1 ][ j ]  ,                       不放第i个水晶: dp[ i ][ j ] = f[ i-1 ][ h[i]-j ] + j,               第i个水晶放在较矮的塔上,原来较矮的塔变成较

vijos P1037搭建双塔

P1037搭建双塔 Accepted 标签:动态规划 背包 描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建.但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座双塔,这座双塔的最大高度是多少.所以他来请你

(转)ubuntu 12.04搭建Adobe Flash Media Server服务

破解版传送门:http://fms45.cuplayer.com/fms4download.html 福利:1462-5247-1705-7678-8379-5590 下载解压 cd进目录,./installFMS 缺少libcap动态库 A required package, libcap, was not found on your Linux x86_64 Debian. sudo apt-get install libcap-dev 获得动态库 安装完后运行./installFMS ,还