- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分支限界法求 0-1 背包问题实验程序以及代码(C++ )
本程序中(规定物品数量为 3,背包容量为 30 ,输入为 6 个数,前 3 个为物品重量,后 3 个数为物品价值):
代码:
#includeiostream #includestack using namespace std; #define N 100
class
HeapNode /定/ 义HeapNode 结点类
{
public:
double
upper,price,weight; //upp为er结点的价值上界,price是结点所对应的价值,weight 为结点所相应的重量 int level,x[N]活; 节点//在子集树中所处的层序号
};
double MaxBound(int i); double Knap();
void AddLiveNode(double up,double cp,double cw,bool ch,int level); stackHeapNode
High; 最//大队 High
double w[N],p[N];把/物/品重量和价值定义为双精度浮点数
double cw,cp,c=30; //为cw当前重量,cp 为当前价值,定义背包容量为 30 int n=3;货物/数/ 量为 3
int main()
{
cout请按顺序输入 3 个物品的重量:(按回车键区分每个物品的重量)endl; int i;
for(i=1;i=n;i++)
cinw[i]; 输//入 3 个物品的重量
cout请按顺序输入 3 个物品的价值:(按回车键区分每个物品的价值)endl; for(i=1;i=n;i++)
cinp[i]; 输入//3 个物品的价值
cout最大价值为:;
coutKnap()endl; /调/用 knap 函数 输出最大价值
return 0;
}
double MaxBound(int j) //MaxBound函数求最大上界
{
double
left=c-cw,b=cp; 剩余//容量和价值上界
while(j=nw[j]=left)
以物/品/
单位重量价值递减装填剩余容量
{
left-=w[j];
b+=p[j]; j++;
}
if(j=n)
b+=p[j]/w[j]*left装; 填剩//余容量装满背包return b;
}
void AddLiveNode(double up,double cp,double cw,bool ch,int lev)
//将一个新的活结点插入到子集数和最大堆 High 中
{
HeapNode be; be.upper=up; be.price=cp; be.weight=cw; be.level=lev; if(lev=n)
High.push(be); 调//用 stack头文件的push 函数
}
double Knap() 优//先队列分支限界法,返回最大价值,bestx 返回最优解
{ int i=1; cw=cp=0; double
bestp=0,up=MaxBound(1); /调/ 用 MaxBound 求出价值上界,best为最优值
while(1) 非叶//子结点
{ double wt=cw+w[i];
if(wt=c) 左/儿/子结点为可行结点
{ if(cp+p[i]bestp) bestp=cp+p[i]; AddLiveNode(up,cp+p[i],cw+w[i],true,i+1);
}
up=MaxBound(i+1);
if(up=bestp) 右/子/ 数可能含最优解
AddLiveNode(up,cp,cw,false,i+1); if(High.empty()) return bestp;
HeapNode node=High.top(); /取/ 下一扩展结点
High.pop(); cw=node.weight; cp=node.price; up=node.upper; i=node.level;
}
}
输出结果为:
您可能关注的文档
- 中考数学知识点反比例函数专题专练反比例函数单元综合测试题.pdf
- 中考数学知识点总结.pdf
- 中考数学第1编知识梳理篇第5章四边形第17讲特殊的平行四边形(精讲)试题(new).pdf
- 中考数学知识点总结版.pdf
- 中考数学第1讲实数复习教案.pdf
- 中考数学第一轮复习 专题八 三角形(1)(无答案) 浙教版(2021年整理).pdf
- 中考数学第一轮复习专题六概率和统计(2)(无答案)浙教版.pdf
- 中考数学第一轮复习专题七平面几何基础(1)(无答案)浙教版.pdf
- 中考数学第一轮复习专题十压轴题(1)(无答案)浙教版.pdf
- 中考数学第一轮复习专题四数量和位置变化(2)(无答案)浙教版.pdf
文档评论(0)