POJ1155-树形DP&&背包
2017-06-27 21:32
495 查看
技巧:num数组,用来记录在此树上最多选择多少个。其他就是背包了
#include <cstdlib> #include <cstdio> #include <iostream> #include <cstring> using namespace std; const int maxn=3002; int m,n; int len; int dp[maxn][maxn],tem[maxn],a[maxn][maxn],head[maxn],num[maxn]; struct node { int now; int val; int next; }tree[9005]; void add(int a,int b,int c) { tree[len].now=a; tree[len].val=b; tree[len].next=head[c];//建立一个树,链式前进星, head[c]=len++; } int dfs(int root) { int p; for(int i=head[root];i!=-1;i=tree[i].next) { p=tree[i].now; dfs(p); for(int l=0;l<=num[root];l++) tem[l]=dp[root][l]; for(int k=0;k<=num[root];k++) for(int j=1;j<=num[p];j++) { dp[root][k+j]=max(dp[root][j+k],dp[p][j]+tem[k]-tree[i].val); } num[root]+=num[p]; } return 0; } int main() { int a,b; int k; while(~scanf("%d%d",&n,&m)) { len=0; memset(head,-1,sizeof(head)); for(int i=1;i<=n-m;i++) { scanf("%d",&k); num[i]=0; for(int c=0;c<k;c++) {scanf("%d%d",&a,&b); add(a,b,i);} } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[i][j]=-9999999; for(int i=n-m+1;i<=n;i++) {scanf("%d",&dp[i][1]); num[i]=1;} dfs(1); //for(int i=1;i<=n-m;i++) // printf("%d ",head[i]); //printf("^^^^\n"); for(int i=m;i>=0;i--) { //printf("%d ",dp[i][1]); if(dp[1][i]>=0) {printf("%d\n",i);break;} } } return 0; }
相关文章推荐
- 树形DP+背包(poj1155泛化分组背包)
- ZOJ 4772 Treasure Hunt I 树形DP(背包) && hdu The Ghost Blows Light 树形DP(背包)
- 树形DP+背包(poj1155泛化分组背包)
- Codeforces Round #419 (Div. 2)-树形dp&依赖背包&-E. Karen and Supermarket
- POJ1155---TELE(树形dp,背包)
- 【树形DP&背包问题】 ◆TopCoder D2L3◆ CollectingTokens
- [BZOJ2427][HAOI2010]软件安装(Tarjan+树形&背包DP)
- TELE (树形DP&背包扩展) #by Plato
- hdu 1561 The more, The Better----树形dp+有依赖的背包
- HDU 1561 The more, The Better 树形DP(0-1背包)
- POJ 1155 TELE 树形DP(0-1背包)
- 1837&nbsp;Balance&nbsp;dp&nbsp;背包
- pku 2057 The Lost House 树形dp+背包dp 解题报告
- poj 2486 Apple Tree 树形DP,树形背包
- DP<背包?> POJ 1015
- HDU 1561 树形DP+有依赖的背包
- HDU 1561 The more, The Better - 依赖背包+树形dp基础
- HDU 1011 Starship Troopers 树形DP(0-1背包)
- hdu 4276 树形DP + 分组背包
- 树形DP <dfs+floyd> 【hlg】 1329 游乐园