學校實行學分制。
每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。
學校開設了 n 門的選修課程,每個學生可選課程的數量 m 是給定的。
學生選修了這 m 門課並考核通過就能獲得相應的學分。
在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其他的一些課程的基礎上才能選修。
例如《windows程式設計》必須在選修了《windows操作基礎》之後才能選修。
我們稱《windows操作基礎》是《windows程式設計》的先修課。
每門課的直接先修課最多只有一門。
兩門課可能存在相同的先修課。
你的任務是為自己確定乙個選課方案,使得你能得到的學分最多,並且必須滿足先修條件。
假定課程之間不存在時間上的衝突。
注意滾動陣列轉移時的細節。
//f(i,j)表示在節點i的子樹內選擇j個節點所能得到的最大學分
#includeusing namespace std;
const int maxn=1010;
typedef long long ll;
ll f[maxn][maxn][2];
int e[maxn];
int a[maxn];
vectorg[maxn];
int n,m;
int rt=0;
int size[maxn];
void dfs (int x)
} size[x]+=size[y];
k^=1;
} e[x]=(k^1);
}int main ()
dfs(0);
//for (int i=1;i<=m;i++) printf("%d\n",f[0][i]);
printf("%lld\n",f[0][m][e[0]]);
}
(選課)揹包類樹形dp
選課 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了 n 門的選修課程,每個學生可選課程的數量 m 是給定的。學生選修了這 m 門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其他的一些課程的基礎上...
luogu P2014 選課 樹形揹包
選課啊,好厲害的一道題,記得當年是瑣大神給我講的呢。樹形揹包 廢話 並不想再抄題幹 用dfs式的樹形dp更新,能過的原因是這題資料範圍是在是太小了。只有500 如果說要注意的地方的話,就是dfs裡的迴圈是逆序的,原因同揹包,從子樹j中,不可能重複選。其實dp i k 是省去了一維的即從i的前j棵子樹...
P2014 選課(樹形揹包)
在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程裡選擇m門...