Vijos P1037 搭建雙塔

2021-07-22 16:51:28 字數 1679 閱讀 3973

p1037搭建雙塔

accepted

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

某校noip模擬題

用dp[i][j]表示前i塊水晶搭建的雙塔高度差值為j時較高的塔的高度
然後dp[i][j]存在四種情況,
這塊水晶不放:dp[i][j] = dp[i - 1][j]
這塊水晶放在矮的塔上面且依舊矮:dp[i][j] = dp[i - 1][j + a[i]]

這塊水晶放在高的塔上:dp[i][j] = dp[i - 1][j - a[i]] + a[i]

這塊水晶放在矮的塔上面且變成高塔:dp[i][j] = dp[i - 1][a[i] - j] + j

求max(1,2,3,4); 

詳細的介紹請見

大牛部落格

**:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxn (1000 + 20) #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long int lli; int dp[maxn][2050]; int sum = 0,a[maxn]; int main() } if(dp[n][0] > 0) printf("%d\n",dp[n][0]); else printf("impossible\n"); return 0; } link=""

VIJOS P1037 搭建雙塔

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