软件工程课程设报告背包问题11.docVIP

  • 0
  • 0
  • 约8.27千字
  • 约 10页
  • 2016-10-10 发布于贵州
  • 举报
软件工程课程设报告背包问题11

2012-2013学年第1学期“软件工程”课程设计报告 学院/系 信息工程学院计算机科学系 专业 计算机科学与技术 班级 项目名称 背包问题算法演示软件设计 组长 王帅 小组成员 王帅、张宇波、 田方、胡应国 王帅(2402090218) 主要负责代码的编写 张宇波(2402090218) 主要负责报告的书写 田方(2402090227) 主要负责报告的书写 胡应国(2402090209) 主要负责系统的测试 一、问题描述及分类 0-1背包问题:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 多重背包问题:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 完全背包问题:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大 我们这次课程设计要研究的内容是 0-1背包问题:在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品装入背包多次,也不能只装入部分的物品。背包问题是一个特殊的整数规划问题 二、简介 它的主要思路是假定某人拥有大量物品,重量各不同。此人通过秘密地选择一部分物品并将它们放到背包中 来加密消息。背包中的物品总重量是公开的,所有可能的物品也是公开的,但背包中的物品是保密的。附加一定的限制条件,给出重量,而要列出可能的物品,在计算上是不可实现的。基本思路 最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 图1 模块调用关系图如下图2 图2 流程图如下图图3: 图3 四、算法: 关键数据结构: 一个数组,一个栈。一个整型变量。 int PerWeight;// 代表每个物品的质量。 pStack pMyStack; // 回溯法时所用到的栈。 int k; // 整个运算过程中数组的索引。 关键的算法代码: do { while (m_BagWeight 0 km_Count) //遍历整个数组把符合条件的数压入栈中 { if (m_BagWeight - PerWeight[k] = 0) { PushStack(k); m_BagWeight = m_BagWeight - PerWeight[k]; } k++; } if (m_BagWeight == 0) //找到合适的解后进行显示处理 { i = 0; pNode pNodeTemp = pTop; while (pNodeTemp != pBase) //遍历整个栈把数据得到 { c[i] = PerWeight[pNodeTemp-DataTemp.num]; i++; pNodeTemp = pNodeTemp-pNext; if (pNodeTemp == NULL) { exit(0); } } str.Format(L第%d组解:,nIndex+1); m_List.InsertItem(nIndex,str); CString str1; if (i == 4) { str1.Format(_T(%d %d %d %d),c[i-4],c[i-3],c[i-2],c[1]); } if (i == 3) { str1.Format(_T(%d %d %d),c[i-3],c[i-2],c[i-1]); } if (i == 2) { str1.Format(_T(%d %d),c[i-2],c[i-1]); } //把所得的数据显示到前台List框 m_List.SetItemText(nIndex,1,str1); memset(c,sizeof(int)*10,0); nIndex++; } k = PopStack(); //把不符合的数据弹出栈。 int temp = PerWeig

文档评论(0)

1亿VIP精品文档

相关文档