- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
软件工程课程设报告背包问题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)