- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
回溯法解0-1背包问题实验报告
实验4 回溯法解0-1背包问题
一 、实验要求
要求用回溯法求解0-1背包问题;
要求交互输入背包容量,物品重量数组,物品价值数组;
要求显示结果。
二 、实验仪器和软件平台
仪器 :带usb接口微机
软件平台:WIN-XP + VC++6.0
三 、实验源码
#include stdafx.h
#includeiostream
#includecstdio
#includeconio.h
#includeiomanip
using namespace std;
templateclass ty
class Knap
{
public:
friend void Init();
friend void Knapsack();
friend void Backtrack(int i);
friend float Bound(int i);
bool operator(Knapty a)const
{
if(fla.fl) return true;
else return false;
}
private:
ty w; //重量
ty v; //价值
float fl; //单位重量的价值v/w
int kk; //记录第几个物品
int flag; //记录是否放入包中
};
templateclass ty
void Sort(Knapty *li,int n)
{
int i,j,k; Knapty minl;
for(i=1;in;i++)
{
minl=li[0]; k=0;
for(j=1;j=n-i;j++)
{
if(minlli[j])
{
minl=li[j]; swap(li[j],li[k]); k=j;
}
}
}
}
namespace jie //命名空间
{
int c=0,n=0;
int *x=NULL;
Knapint *bag=NULL;
int cp=0,cw=0;
int bestp=0;
}
using namespace jie;
void Init()
{
int i=0;
coutendl;
cout请输入物品数量 n = ;
cinn; coutendl;
cout请输入背包容量 C = ;
cinc; coutendl;
bag=new Knapint [n];
x=new int[n];
cout请依次输入n个物品的重量W:endl;
for(i=0;in;i++)
cinbag[i].w;
coutendl;
cout请依次输入n个物品的价值P:endl;
for(i=0;in;i++)
cinbag[i].v;
for(i=0;in;i++)
{
bag[i].flag=0; bag[i].kk=i;
bag[i].fl=1.0*bag[i].v/bag[i].w;
}
}
void Backtrack(int i)
{
if(i=n) //到达叶节点
{
bestp=cp; //更新最优价值
return;
}
if(cw+bag[i].w=c) //进入左子树
{
bag[i].flag=1; cw+=bag[i].w;
cp+=bag[i].v; Backtrack(i+1);
cw-=bag[i].w; cp-=bag[i].v;
}
if(Bound(i+1)bestp)//进入右子树
{
bag[i].flag=0; Backtrack(i+1);
}
}
//计算当前节点处的上界
float Bound(int i)
{
int cleft = c-cw; //剩余容量
float b = cp;
while (inbag[i].w=cleft)
{
//以物品单位重量价值递减序装入
cleft-=bag[i].w ;
b+=bag[i].v;
i++;
}
//装满背包
if (in) b+=1.0*bag[i].v/bag[i].w * cleft;
return b;
}
void Knapsack() //计算最优解和变量值
{
int L(0); //用L累计价值,初始价值设置为0
fo
文档评论(0)