NKOI 1017 搭建雙塔

2021-07-12 03:35:20 字數 1383 閱讀 9138

搭建雙塔

time limit:3000ms  memory limit:65536k

total submit:160 accepted:86

description

2023年9月11日,一場突發的災難將紐約世界**中心大廈夷為平地,mr. f曾親眼目睹了這次災難。為了紀念「911」事件,mr. f決定自己用水晶來搭建一座雙塔。

mr. f有n塊水晶,每塊水晶有乙個高度,他想用這n塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,mr. f可以從這n塊水晶中任取m(1≤m≤n)塊來搭建。但是他不知道能否使兩座塔有同樣的高度,也不知道如果能搭建成一座雙塔,這座雙塔的最大高度是多少。所以他來請你幫忙。

給定水晶的數量n(1≤n≤100)和每塊水晶的高度hi(n塊水晶高度的總和不超過2000),你的任務是判斷mr. f能否用這些水晶搭建成一座雙塔(兩座塔有同樣的高度),如果能,則輸出所能搭建的雙塔的最大高度,否則輸出「impossible」。

input

輸入的第一行為乙個數n,表示水晶的數量。第二行為n個數,第i個數表示第i個水晶的高度。

output

輸出僅包含一行,如果能搭成一座雙塔,則輸出雙塔的最大高度,否則輸出乙個字串「impossible」。

sample input

5

1 3 4 5 2

sample output

7

source

vijos p1037

認真分析完題目後我們發現這道題就是一道多段決策的揹包

我們用f[i][j]來表示前i個水晶搭成的兩座塔的高度差為j時的最大高度

決策無非以下四種:

1.不用該物品

2.將該物品放在較低塔上,並且此時兩個塔的相對高度比較不變

3.將該物品放在較高塔上,並且此時兩個塔的相對高度比較不變

4.將該物品放在較低塔上,並且原先的較低塔變成較高塔

#include#include#includeusing namespace std;  

int n;

int f[105][2005],s[105];

int main()

memset(f,-1,sizeof(f));

f[0][0]=0;

for(i=1;i<=n;i++)

} if(f[n][0]>0) printf("%d",f[n][0]);

else puts("impossible");

}

vijos搭建雙塔(dp)

資料弱,樸素的演算法竟然過了,後來bitset位運算的01揹包優化加上後快了7倍 順便還練習了一下對拍 f i j true,表示塔1高為i,塔2高為j,的情況存在 方程if dp j l 樸素 include includeusing namespace std int a 105 n bool ...

動規 搭建雙塔

搭建雙塔 time limit 3000ms memory limit 65536k total submit 197 accepted 103 description 2001年9月11日,一場突發的災難將紐約世界 中心大廈夷為平地,mr.f曾親眼目睹了這次災難。為了紀念 911 事件,mr.f決...

VIJOS P1037 搭建雙塔

2001年9月11日,一場突發的災難將紐約世界 中心大廈夷為平地,mr.f曾親眼目睹了這次災難。為了紀念 9?11 事件,mr.f決定自己用水晶來搭建一座雙塔。mr.f有n塊水晶,每塊水晶有乙個高度,他想用這n塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,mr.f可以從這n塊水晶中任取m 1 m...