当前位置:   article > 正文

01背包回溯+递归解法_利用回溯法的递归框架,实现 01 背包问题,(问题设定:背包的限定重 量为 6,物品数量

利用回溯法的递归框架,实现 01 背包问题,(问题设定:背包的限定重 量为 6,物品数量

    学校的算法实验,用回溯和递归求解01背包问题。觉得回溯思路不适合解01背包问题,因为01背包问题中掺杂了两个变量:背包容量和携带的价值(价值比较出最大价值),但毕竟是学校实验,还是得做啊。

    我的思路是,设一个数组,长度为物品的数量。数组为赋值为0,则表示当前物品不取;赋值为1,则取。然后对每一位遍历,最后比较。微笑微笑微笑微笑微笑用动态做最省事。

回溯代码:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define M 5
  4. int *choice,*saved;
  5. int maxV = -1;
  6. void KNAPSACK(int *v,int *s,int C,int n);
  7. int main(void)
  8. {
  9. int s[M] = {3,5,7,8,9},v[M] = {4,6,7,9,10},C = 11;
  10. int i=0,sum=0;
  11. KNAPSACK(v,s,C,M);
  12. printf("选择");
  13. for(i=0;i<M;i++)
  14. {
  15. if(saved[i])
  16. {
  17. printf("第%d项,",i+1);
  18. sum+=s[i];
  19. }
  20. }
  21. printf("物品放入背包,");
  22. printf("物品总体积为:%d,总价值为%d.",sum,maxV);
  23. return 0;
  24. }
  25. //v数组价值,s数组体积,C背包容量,n数量
  26. void KNAPSACK(int *v,int *s,int C,int n)
  27. {
  28. choice = (int*)malloc(sizeof(int)*(n+1));
  29. saved = (int*)malloc(sizeof(int)*(n+1));
  30. int flag = 0;
  31. int i=0,j=0,k=0;
  32. int value=0,bag=0;
  33. for(i=0;i<n;i++)
  34. choice[i]=-1,saved[i]=-1;
  35. while(k>=0)
  36. {
  37. while(choice[k]<1) //筛选每一个物品,两种可能,取或者不取分别对应0/1
  38. {
  39. choice[k]++;
  40. if(k==n)
  41. {
  42. value=0,bag=0;
  43. for(i=0;i<n;i++)
  44. {
  45. if(choice[i])
  46. {
  47. bag+=s[i];
  48. value+=v[i];
  49. }
  50. }
  51. if(maxV<value&&bag<=C)
  52. {
  53. maxV = value;
  54. for(i=0;i<n;i++) saved[i] = choice[i];
  55. }
  56. break;
  57. }
  58. else k++;
  59. }
  60. choice[k] = -1;
  61. k--;
  62. }
  63. }

递归代码:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define M 5
  4. int *choice,*saved;
  5. int maxV = -1;
  6. void KNAPSACK(int *v,int *s,int C,int cur);
  7. int main(void)
  8. {
  9. int s[M] = {3,5,7,8,9},v[M] = {4,6,7,9,10},C = 11;
  10. choice = (int*)malloc(sizeof(int)*M);
  11. saved = (int*)malloc(sizeof(int)*M);
  12. int i=0,sum=0;
  13. KNAPSACK(v,s,C,0);
  14. printf("选择");
  15. for(i=0;i<M;i++)
  16. {
  17. if(saved[i])
  18. {
  19. printf("第%d项,",i+1);
  20. sum+=s[i];
  21. }
  22. }
  23. printf("物品放入背包,");
  24. printf("物品总体积为:%d,总价值为%d.",sum,maxV);
  25. return 0;
  26. }
  27. //v数组价值,s数组体积,C背包容量,cur当前位
  28. void KNAPSACK(int *v,int *s,int C,int cur)
  29. {
  30. if(cur==M-1)
  31. {
  32. int value=0,bag=0,i=0;
  33. for(i=0;i<M;i++)
  34. {
  35. if(choice[i])
  36. {
  37. bag+=s[i];
  38. value+=v[i];
  39. }
  40. }
  41. if(maxV<value&&bag<=C)
  42. {
  43. maxV = value;
  44. for(i=0;i<M;i++) saved[i] = choice[i];
  45. }
  46. return;
  47. }
  48. else
  49. {
  50. choice[cur] = 0;
  51. KNAPSACK(v,s,C,cur+1);
  52. choice[cur] = 1;
  53. KNAPSACK(v,s,C,cur+1);
  54. }
  55. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/333065
推荐阅读
相关标签
  

闽ICP备14008679号