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 ...