VIJOS P1037 搭建雙塔

2021-06-17 17:29:04 字數 1242 閱讀 4972

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」。

輸入:
5

1 3 4 5 2

輸出:
7
思路: 揹包
dp[i][j] 表示的是 前i個水晶, 高度差為j, 高塔的高度。
對於第i個水晶, 有3種情況。
1、不放
2、放高塔
3、放矮塔
(1).高塔仍高
(2).矮塔變高塔
#include #include #include #include using namespace std;

const int v = 2000 + 5;

const int maxn = 100 + 5;

int n, sum, num[maxn], dp[2][v];

int main()

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

dp[1][0] = 0;

int a;

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

}if(dp[a][0] > 0)

cout << dp[a][0] << endl;

else

cout << "impossible" << endl;

}

Vijos P1037 搭建雙塔

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

vijosp1037 類揹包問題 好題 搭建雙塔

問你用以下的數字構建兩個 相同高度的雙塔,盡可能的高。開始的思路是 揹包計數。如果 dp m 和dp m 2 和m 2 0 都滿足,那麼我們就可以輸出m 2 m和 m 2 這些數字都能拼出來。但是即使這樣,其實也不一定是可以的,因為很可能 m 2構成的兩次使用了重疊的項,而我們並沒有阻止這一種情況 ...

DP vijos1037 搭建雙塔

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