HDU-1561-A
来源:互联网 发布:数据恢复软件正式版 编辑:程序博客网 时间:2024/06/08 06:55
https://vjudge.net/contest/142381#problem/A
在树上进行背包。
一开始写错了,根据图的关系来进行01背包。
dp[a][i]=max(dp[a][i-1]+b[s],dp[a][i]);
在更近的节点,无法对该分支的数量进行背包。。如果这个分支只有部分解是最优的,那么就无法保存。。
方法1 :初始化为b[i]。
方法2 :初始化为0,最后再加上。。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <vector>using namespace std;/*后根遍历,然后在树上用背包。*/const int maxn=2000;bool vis[maxn];int b[maxn];vector<int>G[maxn];void add(int a,int b){ G[a].push_back(b); //G[b].push_back(a);}int n,m;int dp[maxn][maxn];int ans[maxn][maxn];int dfs(int a){ for(int i=0;i<G[a].size();i++) { int s=G[a][i]; if(!vis[s]) { vis[s]=true; dfs(s); for(int x=m;x>=0;x--) for(int k=0;k<=x;k++) ans[a][x]=max(ans[a][x],ans[a][x-k]+dp[s][k]); } } for(int i=1;i<=m+1;i++) dp[a][i]=ans[a][i-1]+b[a]; return 0;}int main(){ int a; while(~scanf("%d%d",&n,&m)) { memset(ans,0,sizeof(ans)); if(n==0&&m==0) break; for(int i=0;i<maxn;i++) G[i].clear(); b[0]=0; for(int i=1;i<=n;i++) { scanf("%d%d",&a,&b[i]); add(a,i); } for(int i=0;i<=n;i++) for(int j=0;j<=m+1;j++) dp[i][j]=0; memset(vis,false,sizeof(vis)); dfs(0); /*for(int i=1;i<=n;i++) {for(int j=0;j<=m;j++) cout<<dp[i][j]<<" "; cout<<endl; }*/ cout<<dp[0][m+1]<<endl; } return 0;}
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <vector>using namespace std;/*后根遍历,然后在树上用背包。*/const int maxn=2000;bool vis[maxn];int b[maxn];vector<int>G[maxn];void add(int a,int b){ G[a].push_back(b); //G[b].push_back(a);}int n,m;int dp[maxn][maxn];int dfs(int a){ for(int i=0;i<G[a].size();i++) { int s=G[a][i]; if(!vis[s]) { vis[s]=true; dfs(s); for(int i=m+1;i>1;i--) for(int k=1;k<=i;k++) dp[a][i]=max(dp[a][i],dp[a][k]+dp[s][i-k]); } } //for(int i=1;i<=m+1;i++) //cout<<dp[a][i]<<"! "; //cout<<endl; //cout<<a<<endl; return 0;}int main(){ int a; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(int i=0;i<maxn;i++) G[i].clear(); b[0]=0; for(int i=1;i<=n;i++) { scanf("%d%d",&a,&b[i]); add(a,i); } /*for(int i=0;i<=n;i++) { cout<<i<<"!!"; for(int j=0;j<G[i].size();j++) cout<<G[i][j]<<" "; cout<<endl; }*/ for(int i=0;i<=n;i++) for(int j=0;j<=m+1;j++) {dp[i][j]=b[i]; dp[i][0]=0; } memset(vis,false,sizeof(vis)); dfs(0); /*for(int i=1;i<=n;i++) {for(int j=0;j<=m;j++) cout<<dp[i][j]<<" "; cout<<endl; }*/ cout<<dp[0][m+1]<<endl; } return 0;}
阅读全文
0 0
- HDU-1561-A
- Tr A hdu 1575
- HDU Problem A
- HDU A strange lift
- HDU 2033 A+B
- HDU 2034 A-B
- hdu 1412 {A} + {B}
- HDU 1096 A+B
- HDU A^B
- hdu 2102 A计划
- HDU 1412 {A}+{B}
- hdu 1228A+B
- HDU 1412 ( {A} + {B} )
- HDU 1228 ( A + B )
- hdu Just a Hook
- hdu 1575 Tr A
- HDU-2102-A计划
- hdu 1288 A + B
- 两数组的交
- 最长回文串
- spring-boot笔记-HandlerInterceptor和MethodInterceptor(AspectJ)(四)
- java中equals()和equalsIgnoreCase()的区别
- Cesium简介
- HDU-1561-A
- HAWQ取代传统数仓实践(十六)——事实表技术之迟到的事实
- headfirst 代理模式
- PAT 乙级 1015 德才论
- 第四章 String类型数据结构api操作
- POJ-2235 Wireless Network (并查集)
- java开发C语言编译器:JVM 的基本操作指令介绍及其程序运行原理
- 初学者:理解spring-mvc的基本原理
- 【算法题】藏宝图