樹形揹包基礎題

2021-06-23 04:51:11 字數 1182 閱讀 4842

hdu1561

樹形揹包入門

**是vector型鄰接表,用陣列的更好

#include#include#includeusing namespace std;

vectorlist[224];

int dp[224][224];

int value[224];

void dfs( int n ,int m )//m代表攻擊該節點時還剩多少次

}

}}int main( )

for( int i = 1 ; i <= n ; i++ )

dfs( 0 , m+1 );

// printf( "afsa" );

printf( "%d\n",dp[0][m+1] );

}return 0;

}

hdu 4169

樹形揹包,要求兩個所取的節點不相鄰,不要求所謂的約束關係了,用乙個一維的陣列dp[k]表示揹包容量即可

要求不相鄰的話,讀入乙個節點時只把它用來更新當前dp[k],不參與相鄰節點和該點的狀態轉移就好了~(我是這麼理解的,,)

#include #include #include using namespace std;

vectorson[150005];

int dp[305],k,n,w[150005];

const int max_int=10000000;

int dfs(int u)

if (!size)

t=1;

cur[1]=max(cur[1],w[u]);//只有乙個節點時的最大值,取該節點或之前遍歷過的部分的乙個節點中的最大值

//如果取了這個點,

for (int i=0; i<=k; ++i)

dp[i]=cur[i];

return t;//t是該子樹的節點個數

}int main()

dfs(root);

if (dp[k]==-max_int)//取了的元素個數

puts("impossible");

else

printf("%d\n",dp[k]);

}return 0;

}

樹形依賴揹包

問題大意 給出一棵樹,根節點為1,每個點有毒素和收穫。要求毒素不超過給定值的情況下使收穫最大。乙個點的父親節點被選取後這個點才能被選取。首先弄出dfs序,也記錄下每個點其子樹及自身的大小。每個點都能夠被選或不選,如果選了才會考慮它子樹。設f i j 表示dfs序上第i位上的點在其子樹及自身上選取了毒...

樹形揹包總結

目錄 2 有物品大小 3 物品大小為1,有k的限制。二 dfs序上dp 例題1例題2 例題3總結下 樹形揹包,就是說,在樹上選乙個包含根的連通塊,或揹包存在依賴關係 選父才能選子 或者需要知道每個點的子樹中選了多少 通常,我們有兩種方法 我們設 dp i,j 表示在i的子節點中選j個的狀態。在轉移時...

樹形揹包DP

include using namespace std const int n 310,m n 2 int h n ne m v m idx int w n int dp n n int n,m void add int a,int b void dfs int u for int j m j 0 ...