題目描述:
2023年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"。輸入:
513
452
輸出:
7
思路:設dp[
i][j
]dp[i][j]
dp[i][
j]表示前i個高度差為j的矮塔的高度
若第i
ii個塔不取,則dp[
i][j
]=dp
[i−1
][j]
dp[i][j] = dp[i-1][j]
dp[i][
j]=d
p[i−
1][j
];若第i
ii個塔取
放在矮塔上但矮塔還是矮塔. dp[
i][j
]=ma
x(dp
[i][
j],d
p[i−
1][j
+h[i
]]+h
[i])
;dp[i][j] = max(dp[i][j], dp[i-1][j+h[i]] + h[i]);
dp[i][
j]=m
ax(d
p[i]
[j],
dp[i
−1][
j+h[
i]]+
h[i]
);放在矮塔上但矮塔變為高塔. dp[
i][j
]=ma
x(dp
[i][
j],d
p[i−
1][h
[i]−
j]+h
[i]−
j)h[
i]
>=j
dp[i][j] = max(dp[i][j], dp[i-1][h[i]-j] + h[i]-j) \text \text \text \text \text \text \text \texth[i]>=j
dp[i][
j]=m
ax(d
p[i]
[j],
dp[i
−1][
h[i]
−j]+
h[i]
−j)h
[i]>=j
放在高塔上,dp[
i][j
]=ma
x(dp
[i][
j],d
p[i−
1][j
−h[i
]])j
>=h
[i
]dp[i][j] = max(dp[i][j], dp[i-1][j-h[i]])\text \text \text \text \text \text \text \textj>=h[i]
dp[i][
j]=m
ax(d
p[i]
[j],
dp[i
−1][
j−h[
i]])
j>=h
[i]
#include
using
namespace std;
#define maxn 105
#define maxm 2005
int h[maxn]
, dp[maxn]
[maxm]
;int
main()
}int ans = dp[n][0
];if(ans !=0)
cout << dp[n][0
]<< endl;
else
puts
("impossible");
return0;
}
完結撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。 題解 Hanoi 雙塔問題
給定 a b c 三根足夠長的細柱,在 a 柱上放有 2n 個中間有孔的圓盤,共有 n 個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的。現要將這些圓盤移到 c 柱上,在移動過程中可放在 b 柱上暫存。要求 每次只能移動乙個圓盤 a b c 三根細柱上的圓盤都要保持上小下大的順序...
SSL ZYC Hanoi雙塔問題
題目大意 給定a,b,c三根足夠長的細柱,在a柱上放有2n個中間有空的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的 下圖為n 3的情形 現要將 這些國盤移到c柱上,在移動過程中可放在b柱上暫存。要求 1 每次只能移動乙個圓盤 2 a b c三根細柱上的圓盤都要保持...
Hanoi 雙塔問題
operatorname luogup 1096 給定 a aa b bb c cc 三根足夠長的細柱,在 a aa 柱上放有 2n2n 2n個中間有孔的圓盤,共有 n nn 個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的 下圖為 n 3 n 3n 3 的情形 現要將這些圓盤移...