`
coolsooner
  • 浏览: 1315070 次
文章分类
社区版块
存档分类
最新评论

0-1背包问题(动态规划) 解题报告

 
阅读更多

利用动态规划,以自底向上的方式解各子问题。

解题思路:此问题可转化为:给定c>0,wi>0,vi>0,1≤i≤n,要求找出一

个n元0-1向量(x1,x2,…,xn),xi∈{0,1},1≤i≤n,使得∑wixi≤c,而且

∑vixi达到最大。因此,0-1背包是一个特

殊的整数规划问题:

max ∑vixi
s.t. ∑wixi≤c
xi∈{0,1},1≤i≤n
代码如下:
Code:
  1. #include<iostream>
  2. #include<iomanip>
  3. #include<string>
  4. usingnamespacestd;
  5. intMin(intw,intc)//取较小值
  6. {
  7. return(w<c?w:c);
  8. }
  9. intMax(intw,intc)//取较大值
  10. {
  11. return(w<c?c:w);
  12. }
  13. voidKnapsack(intv[],intw[],intc,intn,int**m)
  14. {
  15. intrange1=Min(w[n]-1,c);
  16. for(intj=0;j<=range1;j++)//如果物品的重量超过负重就都复制为0
  17. m[n][j]=0;
  18. for(j=w[n];j<=c;j++)//对于可以放的
  19. m[n][j]=v[n];
  20. for(inti=n-1;i>1;i--)//从下往上
  21. {
  22. range1=Min(w[i]-1,c);
  23. for(j=0;j<=range1;j++)//如果物品的重量超过负重则不加入
  24. m[i][j]=m[i+1][j];
  25. for(intrange2=w[i];range2<=c;range2++)
  26. m[i][range2]=Max(m[i+1][range2],m[i+1][range2-w[i]]+v[i]);//放与不放中取较大值
  27. }
  28. m[1][c]=m[2][c];//对第一个物品进行处理
  29. if(c>=w[1])
  30. m[1][c]=Max(m[1][c],m[2][c-w[1]]+v[1]);
  31. cout<<"最优解:"<<m[1][c]<<endl;
  32. }
  33. voidPrint_Case(int**m,intw[],intc,intn,intx[])//输出物品存放的情况
  34. {
  35. cout<<"得到的一组最优解如下:"<<endl;
  36. for(inti=1;i<n;i++)
  37. if(m[i][c]==m[i+1][c])
  38. x[i]=0;
  39. else
  40. {
  41. x[i]=1;
  42. }
  43. x[n]=(m[n][c])?1:0;
  44. for(inty=1;y<=n;y++)
  45. {
  46. cout<<setw(5)<<x[y];
  47. }
  48. cout<<endl;
  49. return;
  50. }
  51. voidmain()
  52. {
  53. intn,c;
  54. int**m;
  55. cout<<"请输入物品的个数以及重量的上限:";
  56. cin>>n>>c;
  57. int*v=newint[n+1];
  58. cout<<"请输入物品的价值(v[i]:)"<<endl;
  59. for(inti=1;i<=n;i++)
  60. cin>>v[i];
  61. int*w=newint[n+1];
  62. cout<<"请输入物品的重量(w[i]):"<<endl;
  63. for(intj=1;j<=n;j++)
  64. cin>>w[j];
  65. int*x=newint[n+1];
  66. m=newint*[n+1];
  67. for(intp=0;p<n+1;p++)
  68. {
  69. m[p]=newint[c+1];
  70. }
  71. Knapsack(v,w,c,n,m);
  72. Print_Case(m,w,c,n,x);
  73. }

分享到:
评论

相关推荐

    用c++实现的 0-1背包 回溯法

    问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应到少包含问题的一个(最优)解。 b. 回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度...

    0-1背包问题.txt

    今天给大家分享0-1背包问题的基本解题思路。小白教程,不涉及到动态规划以及状态转移方程等术语,随着后面的更新,这些都会讲到。 问题描述 给你一个可容纳最大重量为 w 的背包和 N 个物品,每个物品有重量和...

    用分枝界限 回溯+剪枝 动态规划 解决01背包问题

    问题描述:给定一个容量为C的背包及n个重量为wi,价值 为p1的物品,要求把物品装入背包,是背包的价值最大, ...解决方法:0/1背包问题有多种解决方法,本实验用动态规 划,回溯,分支界限三种方法进行解题

    背包问题的回溯算法

    结合0-1背包问题介绍了回溯法的基本思想和解题步骤,并在VC++6.0环境下验证了回溯法可以有效地解决0-1背包问题。

    IOI国家集训队论文集1999-2019

    俞 玮 -《基本动态规划问题的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退一步海阔天空——"目标转化思想"的若干应用》 方 奇 -《浅谈必要条件的应用》 符文杰 -《排序网络》 何江舟 -《用...

    算法分析之回溯法算法框架课件

    回溯法的算法框架 具有限界函数的深度优先生成法称为回溯法。 运用回溯法解题通常包含三个步骤 例如,对于有n种可选物品的0-1背包问题,其解空间由长度为n的0-1向量组成

    贪心算法综述.docx

    贪心算法解题步骤,经典实例(钱币找零问题、活动选择问题、区间覆盖问题、小船过河问题、Dijkstra最短路径算法(图)、prim最小生成树算法、哈夫曼树和编码、部分背包问题(非0-1背包))。*部分经典实例没有题目...

    codingMatch.zip

    比赛所给题库的解题代码,一共十四题实现 斐波那契,0-1背包,最短路径; 递归,回文链表,最长子字符串

    树型状态空间问题的回溯法 C语言编程模式 (2013年)

    针对树型状态空间的回溯提出了一个 C语言编程模式,并利用 n皇后、 0-1背包这2个典型问题验证了该模式的正确性。该模式有助于提升对回溯法解题的理解,提高回溯法实 现的可复用性,扩大回溯法的应用范围。

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    《妙趣横生的算法(C语言实现)》可作为算法入门人员的教程,也...9.4 0-1背包问题 9.5 八皇后问题求解 9.6 简易文件加密/解密系统 第10章 算法设计与数据结构面试题精粹 10.1 常见的算法设计题 10.2 常见的数据结构题

    ACM模板(几乎全)

    5.5 0/1背包问题 68 6 组合数学相关 69 6.1 The Number of the Same BST 69 6.2 排列生成 71 6.3 逆序 72 6.3.1 归并排序求逆序 72 7 数值分析 72 7.1 二分法 72 7.2 迭代法(x=f(x)) 73 7.3 牛顿迭代 74 7.4 数值...

    【语音识别】基于DWT算法0~9数字语音识别的Matlab代码.zip

    1.3.2 各类车辆路径规划问题研究(vrp、VRPTW、CVRP) 1.3.3 机器人路径规划问题研究 1.3.4 无人机三维路径规划问题研究 1.3.5 多式联运问题研究 1.3.6 无人机结合车辆路径配送 **1.4 三维装箱求解** **1.5 ...

    leetcode计算机刷墙-learnNote:各种学习笔记

    0、解题方法总结 1、BFS 2、DFS 3、DP 4、二分 5、位运算 6、双指针 7、哈希表 8、回溯 9、字符串 10、数学 11、数组 12、滑动窗口 13、链表 14、字典树 15、堆 16、前缀和 17、背包问题 ...... 陆续更新中

Global site tag (gtag.js) - Google Analytics