算法实验5《算法综合实验》

举报
用户已注销 发表于 2021/11/19 05:21:36 2021/11/19
【摘要】 使用回溯法解决0-1背包问题 #include<iostream>using namespace std; int n, c, bestp; //物品的个数,背包的容量,最大价值int p[80], w[80], x[80], bestx[80]; //物品的价值,物品的重量,x[i]暂存物品的选中情况,物品的选...

使用回溯法解决0-1背包问题


  
  1. #include<iostream>
  2. using namespace std;
  3. int n, c, bestp; //物品的个数,背包的容量,最大价值
  4. int p[80], w[80], x[80], bestx[80]; //物品的价值,物品的重量,x[i]暂存物品的选中情况,物品的选中情况
  5. void Backtrack(int i, int cp, int cw)
  6. { //cw当前包内物品重量,cp当前包内物品价值
  7. int j;
  8. if (i>n)//回溯结束
  9. {
  10. if (cp>bestp)
  11. {
  12. bestp = cp;
  13. for (i = 0; i <= n; i++) bestx[i] = x[i];
  14. }
  15. }
  16. else
  17. for (j = 0; j <= 1; j++)
  18. {
  19. x[i] = j;
  20. if (cw + x[i] * w[i] <= c)
  21. {
  22. cw += w[i] * x[i];
  23. cp += p[i] * x[i];
  24. Backtrack(i + 1, cp, cw);
  25. cw -= w[i] * x[i];
  26. cp -= p[i] * x[i];
  27. }
  28. }
  29. }
  30. int _tmain(int argc, _TCHAR* argv[])
  31. {
  32. bestp = 0;
  33. cout << "输入背包最大容量,物品个数,物品的重量,物品的价值\n";
  34. cin >> c;
  35. cin >> n;
  36. for (int i = 1; i <= n; i++)cin >> w[i];
  37. for (int i = 1; i <= n; i++)cin >> p[i];
  38. Backtrack(1, 0, 0);
  39. cout << "最大价值为:" << bestp;
  40. printf("\n被选中的物品依次是\n");
  41. for (int i = 1; i <= n; i++)if (bestx[i])cout << "第" << i << "个物品" << endl;
  42. system("pause>nul");
  43. return 0;
  44. }

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/78871857

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。