搭建雙塔
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
5sample output1 3 4 5 2
7source
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...