当前位置:   article > 正文

动态规划——背包问题(C语言)_背包问题[动态规划]代码

背包问题[动态规划]代码

背包问题一般也是很难去理解,最主要的是理解思路

废话不多说,直接开始。

首先可以理解为像是一个树一样;

左子树为拾取,右子树为不拾取

假如背包容量为 8。然后有以下一些物品 

物品1物品2物品3物品4
序号1234
体积4335
价值5544

类似于这样:

以下是C语言代码实现,注释已写

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /*val是物品的价值,v为物品的体积,dp第一个是物品的下标
  4. * 第二个是物品的体积,意为价值
  5. *
  6. */
  7. int val[1001], v[1001], dp[1001][1001] = { 0 };
  8. int n, V;
  9. int Max(int a, int b) //判断大小
  10. {
  11. return a > b ? a : b;
  12. }
  13. void backpack() {
  14. for (int i = v[0]; i <= V; i++) {
  15. dp[0][i] = val[0]; //当背包容量大于物品容量时,放入物品0
  16. }
  17. for (int i = 1; i <= n; i++){
  18. for (int j = 1; j <= V; j++) { //先便利物品再遍历体积
  19. if(j<v[i]) //!!!!!当前!!!!背包体积小于物体体积
  20. dp[i][j]=dp[i-1][j]; //不放入,并且把空的全部填上i-1物品的价值
  21. else
  22. {
  23. dp[i][j] = Max(dp[i-1][j],dp[i-1][j-v[i] ]+ val[i]);
  24. //比较放入之前与放入之后的价值;
  25. //j-v[i]表示放了物品i,还剩下j-v[i]的容量
  26. //放之后的价值 = 放之前的价值+物品i的价值
  27. //dp[i-1][j-v[i]],表示不放物品i时的价值
  28. //看是装下这个物品的价值大还是不装下价值大(与i-1物品进行比较)
  29. }
  30. }
  31. }
  32. }
  33. int main()
  34. {
  35. scanf("%d%d", &n, &V);
  36. for (int i = 0; i < n; i++)
  37. scanf("%d %d", &v[i], &val[i]);
  38. backpack();
  39. printf("%d", dp[n][V]);
  40. return 0;
  41. }

 

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

闽ICP备14008679号