貪吃的九頭龍

2022-02-26 14:22:20 字數 1662 閱讀 2076

【題目描述】

有一天,有m個腦袋的九頭龍看到一棵長有n個果子的果樹,想把果子一口全部吃掉。可是必須照顧到每個頭,因此它需要把n個果子分成m組,每組至少有乙個果子,讓每個頭吃一組。

這m個腦袋中有乙個最大,稱為「大頭」,是眾頭之首,它要吃掉恰好k個果子,而且k個果子中理所當然地應該包括唯一的乙個最大的果子。果子由n-1根樹枝連線起來,由於果樹是乙個整體,因此可以從任意乙個果子出發沿著樹枝「走到」任何乙個其他的果子。

對於每段樹枝,如果它所連線的兩個果子需要由不同的頭來吃掉,那麼兩個頭會共同把樹枝弄斷從而把果子分開;如果這兩個果子是由同乙個頭來吃掉,那麼這個頭會直接把果子連同樹枝一起吃掉。每段樹枝都有乙個吃下去的「難受值」,而九頭龍的難受值就是所有頭吃掉的樹枝的「難受值」之和。

九頭龍希望你可以算出最小的「難受值」。

【輸入描述】

輸入的第1行包含三個整數n(1 <= n <= 300)、m(2 <= m <= n)、k(1 <= k <=n)。n個果子依次編號1、2、······、n,且最大的果子的編號總是1。第2行到第n行描述了果樹的形態,每行包含三個整數a(1 <= a <= n)、b(1 <= b <= n)、c(0 <= c <= 10^5),表示存在一段難受值為c的樹枝連線果子a和果子b。

【輸出描述】

輸出僅有一行,包含乙個整數,表示在滿足「大頭」的要求的前提下,九頭龍的難受值的最小值。如果無法滿足要求,輸出-1。

【樣例輸入】

8 2 4

1 2 20

1 3 4

1 4 13

2 5 10

2 6 12

3 7 15

3 8 5

【樣例輸出】

4【資料範圍及提示】

例如圖1所示的例子中,果樹包含8個果子,7段樹枝,各段樹枝的「難受

值」標記在了樹枝的旁邊。九頭龍有兩個腦袋,大頭需要吃掉4個果子,其中必

須包含最大的果子。即n=8,m=2,k=4:

圖一描述了果樹的形態,圖二描述了最優策略。

源**:

#include

#include

#include

using

namespace

std;

int n,m,k,num,f[301][301][2],tmp[301][2],next[301

<<1],data[301

<<1],value[301

<<1],h[301]=,sum[301]=;

void add(int t1,int t2,int

t)void min(int &t1,int t2,int

t3)void dp(int x,int

from)

}}int

main()

num=1

;

for (int a=1;a)

dp(1,0);

printf(

"%d\n

",f[1][k][1

]);

return0;

}

貪吃的九頭龍

傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫 九頭龍 但這只是說它出生的時候有九個 頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。有一天,有 m 個腦袋的九頭龍看到一棵長有 n個果子的果樹,喜出望外,恨不得一口把它全部吃掉。可是必須照顧到每個頭,...

貪吃的九頭龍

時間限制 2 sec 記憶體限制 128 mb 提交 57 解決 22 提交 狀態 我的提交 傳說中的九頭龍是一種特別貪吃的動物。雖然名字叫 九頭龍 但這只是說它出生的時候有九個頭,而在成長的過程中,它有時會長出很多的新頭,頭的總數會遠大於九,當然也會有舊頭因衰老而自己脫落。有一天,有m 個腦袋的九...

樹形DP 貪吃的九頭龍

題意 思路首先,判斷是否有解是十分簡單的。我們只需要看在給每個小頭分配1個,大頭分配k個的情況下,所需要的果子的數量是否大於了蘋果的總數。也就是m k是否 n。接下來就是有解的情況了。首先我們需要知道,再分配好大頭之後,剩下的果子必然存在一種分配方式,使得九頭龍的難受值不會再增加。我們可以先考慮一堆...