金明的預算方案加選課(樹上的揹包)

2021-07-11 07:35:38 字數 1509 閱讀 6443

【模擬試題】選課

time limit:10000ms  memory limit:65536k

total submit:365 accepted:166 

case time limit:1000ms

description

在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前 學習。現在有n

門功課,每門課有個學分,每門課有一門或沒有直接先修課(若課程

a是課程

b的先修課即只有學完了課程

a,才能學習課程

b)。乙個學生要從這 些課程裡選擇

m門課程學習,問他能獲得的最大學分是多少?

input

第一行有兩個整數n,m

用空格隔開。

(1<=n<=300,1<=m<=200) 

接下來的n行,

第i+1

行包含兩個整數ki和

si, ki

表示第i

門課的直接先修課,

si表示第

i門課的學分。若

ki=0

表示沒有直接先修課(

1<=ki<=n, 1<=si<=20)。

output

只有一行,選m

門課程的最大得分。

sample input

7 4

2 2

0 1

0 4

2 1

7 1

7 6

2 2

sample output13

source

xinyue

題目:題意:你要在n門課中選出m門,使得獲得的學分最大,當然有的課依賴於別的課先選。。。

分析:很容易想到在樹上揹包來解決問題,假設f[i][j]為以i為根的子樹,包括i,選擇j門課的最大值

那麼有f[i][j]=maxk是i的子樹,a+b=j

這樣的複雜度是o(n*m^2)對於這題的資料範圍來說還是夠用的,不過我用上了對這種泛化物品的揹包的一種優化

複雜度降為o(n*m)

【ac**】

#include using namespace std;

const int maxn = 302;

int dp[maxn][maxn],k[maxn],s[maxn];

int n,m;

void tree_dp(int root,int c)

tree_dfs(i,c-v[i]);

for(int j=v[i]; j<=c; j++)

}else

continue;}}

}int main()

return 0;

}

金明的預算方案 01揹包

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例...

金明的預算方案 揹包問題

金明的預算方案 budget 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬 敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過 n 元錢就行 今天一早,金明就開始做預算了,他把想買的物品分 為兩類 主件與附件,附...

金明的預算方案 樹形揹包

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例...