初見安~這裡是傳送門:洛谷p1504
xc的兒子小xc最喜歡玩的遊戲用積木壘漂亮的城堡。城堡是用一些立方體的積木壘成的,城堡的每一層是一塊積木。小xc是乙個比他爸爸xc還聰明的孩子,他發現壘城堡的時候,如果下面的積木比上面的積木大,那麼城堡便不容易倒。所以他在壘城堡的時候總是遵循這樣的規則。
小xc想把自己壘的城堡送給幼兒園裡漂亮的女孩子們,這樣可以增加他的好感度。為了公平起見,他決定把送給每個女孩子一樣高的城堡,這樣可以避免女孩子們為了獲得更漂亮的城堡而引起爭執。可是他發現自己在壘城堡的時候並沒有預先考慮到這一點。所以他現在要改造城堡。由於他沒有多餘的積木了,他靈機一動,想出了乙個巧妙的改造方案。他決定從每乙個城堡中挪去一些積木,使得最終每座城堡都一樣高。為了使他的城堡更雄偉,他覺得應該使最後的城堡都盡可能的高。
請你幫助小xc編乙個程式,根據他壘的所有城堡的資訊,決定應該移去哪些積木才能獲得最佳的效果。
第一行是乙個整數n(n<=100),表示一共有幾座城堡。以下n行每行是一系列非負整數,用乙個空格分隔,按從下往上的順序依次給出一座城堡中所有積木的稜長。用-1結束。一座城堡中的積木不超過100塊,每塊積木的稜長不超過100。
乙個整數,表示最後城堡的最大可能的高度。如果找不到合適的方案,則輸出0。
輸入樣例:
22 1 –1
3 2 1 –1
輸出樣例:
3本題要求每個城堡一樣高且盡量高,即求每個城堡都可達到的最大高度,所以可以將這些城堡看做只是分了堆的積木,列舉每個城堡可達到的高度,最後達到的城堡數量正好為n個城堡的最大高度即為所求。
思路看起來很簡單(卡了我乙個多小時 ),重點在於:如何列舉每個城堡可以達到的高度?如果全用for迴圈來列舉的話,會比較麻煩,所以——可以用到揹包問題的思路(說白了還是列舉 )
但從大到小列舉的原因——你們可以手動樣例試一下(懶得解釋 ),一開始是為了避免重複(後來發現避免不了就懶得改了 )。
**如下——
#includeusing namespace std;
bool dp[30000];
int n;
int a[100];
int ans[100000];
int maxn;
int main()
if(sum>maxn) maxn=sum;
for(int j=1;j<=t;j++)}}
}for(int i=maxn;i>=1;i--)
{if(ans[i]==n)
{cout《迎評:)
——end——
P1504 積木城堡(洛谷)
xc的兒子小xc最喜歡玩的遊戲用積木壘漂亮的城堡。城堡是用一些立方體的積木壘成的,城堡的每一層是一塊積木。小xc是乙個比他爸爸xc還聰明的孩子,他發現壘城堡的時候,如果下面的積木比上面的積木大,那麼城堡便不容易倒。所以他在壘城堡的時候總是遵循這樣的規則。小xc想把自己壘的城堡送給幼兒園裡漂亮的女孩子...
vijos 積木城堡
恰似今天更了七章 我該怎麼辦 看上去好像只能瘋狂寫揹包啦 他們說周四化學通練,我好慌 描述 第一行是乙個整數n n 100 表示一共有幾座城堡。以下n行每行是一系列非負整數,用乙個空格分隔,按從下往上的順序依次給出一座城堡中所有積木的稜長。用 1結束。一座城堡中的積木不超過100塊,每塊積木的稜長不...
積木城堡 dp
xc的兒子小xc最喜歡玩的遊戲用積木壘漂亮的城堡。城堡是用一些立方體的積木壘成的,城堡的每一層是一塊積木。小xc是乙個比他爸爸xc還聰明的孩子,他發現壘城堡的時候,如果下面的積木比上面的積木大,那麼城堡便不容易倒。所以他在壘城堡的時候總是遵循這樣的規則。小xc想把自己壘的城堡送給幼兒園裡漂亮的女孩子...