zoukankan      html  css  js  c++  java
  • 搭建双塔


    描述

    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


    【题解】

    阶段性DP,我们可以设f[i][j]表示从1~i个水晶中拼成高度差为j的两个塔中高度较低的塔的最高值

    对于每一个阶段,我们有三种情况

    1.不拿i

    2.拿i且放在高塔上

    3.拿i且放在低塔上

    对于(1)

    f[i-1][j]

    对于(2)

    f[i-1][j+h[i]]

    对于(3)

    f[i-1][j-h[i]]或者f[i-1][h[i]-j]

    不难看出对于每个阶段是去更新其影响的项

    #include<cstdio>
    #include<cstring>
    int f[110][1100],h[110],tot=0;
    inline int max(int a,int b) {return a>b?a:b;}
    int main() {
    	int n;
    	scanf("%d",&n);
    	for(int i=1; i<=n; i++)
    		scanf("%d",&h[i]),tot+=h[i];
    	tot>>=1;
    	memset(f,-1,sizeof(f));
    	f[0][0]=0;
    	for(int i=1; i<=n; i++) {
    		for(int j=0; j<=tot; j++) {
    			if(f[i-1][j]!=-1)//不放
    				f[i][j]=max(f[i][j],f[i-1][j]);
    			if(j-h[i]>=0&&f[i-1][j-h[i]]!=-1)
    				f[i][j]=max(f[i][j],f[i-1][j-h[i]]+h[i]);
    			if(h[i]-j>=0&&f[i-1][h[i]-j]!=-1)
    				f[i][j]=max(f[i][j],f[i-1][h[i]-j]+j);
    			if(h[i]+j<=tot&&f[i-1][j+h[i]]!=-1)
    				f[i][j]=max(f[i][j],f[i-1][h[i]+j]);
    		}
    	}
    	if(f[n][0]==0)puts("Impossible");
    	else printf("%d
    ",f[n][0]);
    	return 0;
    }









  • 相关阅读:
    Realtime crowdsourcing
    maven 常用插件汇总
    fctix
    sencha extjs4 command tools sdk
    首次吃了一颗带奶糖味的消炎药,不知道管用不
    spring mvc3 example
    ubuntu ati driver DO NOT INSTALL recommand driver
    yet another js editor on windows support extjs
    how to use springsource tools suite maven3 on command
    ocr service
  • 原文地址:https://www.cnblogs.com/kcfzyhq/p/8475585.html
Copyright © 2011-2022 走看看