HDU 3449 有依赖的01背包

前端之家收集整理的这篇文章主要介绍了HDU 3449 有依赖的01背包前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

给出n个盒子,和总钱数w

对于n个盒子,首先买盒子需要花费m,然后可以买盒子中的物品,每个物品分别有其花费a[i].w和价值a[i].v

典型的有依赖的01背包


mark存储前i-1个盒子的dp值

然后对于当前盒子,先不考虑其盒子的花费进行01背包

然后对于mark数组的得到的每个新值mark[i},去更新dp[i+a[i].m];


  1. #include "stdio.h"
  2. #include "string.h"
  3.  
  4. struct node
  5. {
  6. int n,m;
  7. int w[11],v[11];
  8. } a[51];
  9.  
  10. int dp[100010],mark[100010];
  11.  
  12. int Max(int a,int b)
  13. {
  14. if (a<b) return b;
  15. else return a;
  16. }
  17. int main()
  18. {
  19. int n,w,i,j,k,ans;
  20. while (scanf("%d%d",&n,&w)!=EOF)
  21. {
  22. for (i=1; i<=n; i++)
  23. {
  24. scanf("%d%d",&a[i].m,&a[i].n);
  25. for (j=1; j<=a[i].n; j++)
  26. scanf("%d%d",&a[i].w[j],&a[i].v[j]);
  27. }
  28.  
  29. memset(dp,sizeof(dp));
  30.  
  31. for (i=1; i<=n; i++)
  32. {
  33. for (k=0; k<=w; k++)
  34. mark[k]=dp[k];
  35. for (j=1; j<=a[i].n; j++)
  36. for (k=w; k>=a[i].w[j]; k--)
  37. {
  38. if (mark[k-a[i].w[j]] + a[i].v[j] >mark[k])
  39. mark[k]=mark[k-a[i].w[j]]+a[i].v[j];
  40. }
  41. for (k=0; k+a[i].m<=w; k++)
  42. dp[k+a[i].m]=Max(dp[k+a[i].m],mark[k]);
  43. }
  44. ans=0;
  45. for (i=0; i<=w; i++)
  46. ans=Max(ans,dp[i]);
  47. printf("%d\n",ans);
  48.  
  49.  
  50. }
  51. return 0;
  52. }

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