樹形依賴揹包問題
每個點有個權值和體積,如果選了某個點那麼它的父親也必須選,問體積和<=m的最大權值和。
腫麼辦?
我們考慮求出樹的後序遍歷,那麼對於i這棵子樹,它在後序遍歷上是連續一段,並且i在最後,這樣就可以確保轉移時需要的狀態已經計算完畢。
考慮i選還是不選,如果選的話f[i]可以從f[i−1]轉移過來,否則直接從f[i−size[i]]copy過來。
需要注意一些細節,詳見**:
#include#include#includeusing namespace std;
templateinline void read(t& t)
templateinline void read(t& t,args&... args)
const int maxn=65;
const int maxm=32005;
int f[maxn][maxm];
vectorson[maxn];
int v[maxn],w[maxn];
int n,m,v,p,q;
int sz[maxn],suf[maxn],cnt;
void dfs(int u)
printf("%d\n",f[cnt][m]);//注意應該輸出虛擬節點
return 0;
}
P1064 金明的預算方案
原題鏈結 本來是道dp題,我們拿來練搜尋了 雖然最後還是寫了dp 一開始的時候把每個情況都單獨拿出來了變成01揹包 但是有可能出現 選了主件a 選了主件a和附件a1 同時被選中的情況 這樣當然就不符合題意了呀 因為每個主件頂多只有兩個附件所以可以列舉情況直接變成分組揹包 每組裡面只能選乙個 incl...
P1064 金明的預算方案
金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例...
P1064 金明的預算方案
輸入 1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0 輸出 2200這道題是一道依賴揹包問題,所謂依揹包就是i依賴於j,表示若選物品i,則必須選物品j。為了簡化起見,我們先設沒有某個物品既依賴於別的物品,又被別的物品所依賴 另外,沒有某件物品同時依賴多件...