【模擬試題】選課
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元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例...