動規 搭建雙塔

2022-08-12 16:54:12 字數 2071 閱讀 4844

搭建雙塔

time limit:3000ms  memory limit:65536k

total submit:197 accepted:103

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
sourcevijos p1037

凍龜題。

階段:按處理每塊水晶劃分為n個階段

狀態:f[i][j] 前i塊水晶搭成雙塔,高低差為j時較低的塔最高的高度

決策

1.不放

f[i-1][j]

2.放置在較高的塔上

f[i-1][j - v[i]] (j >= v[i])

3.放置在較低的塔上

(1)放置後超過了原較高的塔

f[i-1][v[i]-j]+v[i]-j (j < v[i])

(2)放置後仍低於原較高的塔

f[i-1][j + v[i]] + v[i] (j <= sum - v[i])

範圍:

1 <= i <= n

0 <= j <= sum (sum = v[1]+v[2]+...+v[n])

順序

i:4個方程都只用到i-1,所以i從1到n依次列舉即可

j:有點亂,沒想出無判斷寫法;可以賦個初始特殊值(下面用-1表示),每次用到的時候判斷一下是否是特殊值

初值

f[0][0] = 0

f[i][j] = -1 (特殊值,0 <= i <= n,0 <= j <= sum)

咳咳。所以最後漸進時間複雜度o(sumn)。不知道這麼寫對不對啊,題中說sum最大值為2000,故最壞的情況是o(2000n)。

吐槽

原題時間限制3000ms,超暴力的做法也能a

**

1 #include 2

intn;

3int v[105], sum, f[105][2005];4

5void getint_(int &num)613

14void getmax(int &t1, int

t2)15

2021

void

input()

2229

return;30

}3132void

solve()

3350

return;51

}5253void

output()

5461

62int

main()

63

ghcred's code

Employment Planning 動規小練

employment planning 原題鏈結 對於當前月份所需人數,和僱傭最大所需人數之間的情況進行討論。由於解雇金額和僱傭金額的存在,會存在一次性僱傭更多的人以減少解雇金額的情況,所以要討論到所需最大人數。include include include include include incl...

2016 7 13 樹形動規

rmq演算法講完沒幾個小時,我們就開始了小紫中的一節 足見這個演算法很重要 樹形動歸 1.焦作一中資訊學oy 2.小黃 資訊學奧賽一本通 3.小紫 演算法競賽入門經典第二版 題型總結 來自資料1 1 加分二叉樹 區間動規 樹的遍歷 2 二叉蘋果樹 二叉樹上的動規 3 最大利潤 多叉樹上的動規 4 選...

序列型動規

d i 中的i表示前i的元素的某種性質。有一排n棟房子,每棟房子要漆成k種顏色中的一種 任何兩棟相鄰的房子不能漆成同樣的顏色 房子i染成第j種顏色的花費是cost i j 問最少需要花多少錢油漆這些房子 輸入 n 3,k 3 cost 14,2,11 11,14,5 14,3,10 輸出 10 房子...