HDU 1561 依赖背包

前端之家收集整理的这篇文章主要介绍了HDU 1561 依赖背包前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. const int N = 210;
  6. int n,m;
  7. int head[N],son[N];
  8. int w[N];
  9. int dp[N][N];
  10.  
  11. int max(int a,int b) {return a > b ? a : b;}
  12.  
  13. int dfs(int fa)
  14. {
  15. int i,j,k;
  16. int tot = 1;
  17. dp[fa][1] = w[fa];
  18. for(i = son[fa]; i != -1; i = head[i])
  19. {
  20. tot += dfs(i); //剪枝,每次只用循环到当前能达到的最大值。
  21. for(j = tot; j >= 1; j--)
  22. for(k = 1; k+j <= tot+1; k++)
  23. dp[fa][j+k] = max(dp[fa][j+k],dp[fa][j]+dp[i][k]);
  24. }
  25. return tot;
  26. }
  27.  
  28. int main()
  29. {
  30. int i,k;
  31. while(scanf("%d%d",&n,&m),n+m)
  32. {
  33. memset(son,-1,sizeof(son));
  34. w[0] = 0;
  35. for(i = 1; i <= n; i++)
  36. {
  37. scanf("%d%d",&j,w+i);
  38. head[i] = son[j];
  39. son[j] = i;
  40. }
  41. memset(dp,sizeof(dp));
  42. dfs(0);
  43. printf("%d\n",dp[0][m+1]);
  44. }
  45. return 0;
  46. }
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MAX 210
  5.  
  6. #define max(a,b) (a)>(b) ? (a) : (b)
  7.  
  8.  
  9. struct node {
  10. int v;
  11. node *next;
  12. }*head[MAX],tree[MAX];
  13.  
  14. int n,m,money[MAX];
  15. int ptr,dp[MAX][MAX];
  16.  
  17.  
  18. void Initial() {
  19. ptr = 1;
  20. memset(dp,sizeof(dp));
  21. memset(head,NULL,sizeof(head));
  22. }
  23.  
  24. void AddEdge(int fa,int son) {
  25. tree[ptr].v = son;
  26. tree[ptr].next = head[fa];
  27. head[fa] = &tree[ptr++];
  28. }
  29.  
  30. int Tree_DP(int v) {
  31.  
  32. int i,k,tot = 1;
  33. node *p = head[v];
  34.  
  35. while (p != NULL) {
  36.  
  37. tot += Tree_DP(p->v);
  38. int tp = tot < m ? tot : m; //加个剪枝,这个到目前为止能到达最大容量
  39. for (j = tp; j >= 1; --j) //分组背包
  40. for (i = 1; i <= j; ++i)
  41. dp[v][j] = max(dp[v][j],dp[p->v][i]+dp[v][j-i]);
  42. p = p->next;
  43. }
  44.  
  45. if (v != 0) {
  46. for (j = m; j >= 1; --j)
  47. dp[v][j] = dp[v][j-1] + money[v]; //必选当前节点自己
  48. }
  49. return tot;
  50. }
  51.  
  52.  
  53. int main()
  54. {
  55. int i,a,b;
  56. while (scanf("%d%d",n+m) {
  57. Initial();
  58. for (i = 1; i <= n; ++i) {
  59. scanf("%d%d",&a,&b);
  60. money[i] = b;
  61. AddEdge(a,i);
  62. }
  63. Tree_DP(0);
  64. printf("%d\n",dp[0][m]);
  65. }
  66. }

猜你在找的设计模式相关文章