计算机算法与设计分析实验报告徐绍东4Word文档格式.docx

上传人:b****5 文档编号:19425941 上传时间:2023-01-06 格式:DOCX 页数:10 大小:30.78KB
下载 相关 举报
计算机算法与设计分析实验报告徐绍东4Word文档格式.docx_第1页
第1页 / 共10页
计算机算法与设计分析实验报告徐绍东4Word文档格式.docx_第2页
第2页 / 共10页
计算机算法与设计分析实验报告徐绍东4Word文档格式.docx_第3页
第3页 / 共10页
计算机算法与设计分析实验报告徐绍东4Word文档格式.docx_第4页
第4页 / 共10页
计算机算法与设计分析实验报告徐绍东4Word文档格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

计算机算法与设计分析实验报告徐绍东4Word文档格式.docx

《计算机算法与设计分析实验报告徐绍东4Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机算法与设计分析实验报告徐绍东4Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

计算机算法与设计分析实验报告徐绍东4Word文档格式.docx

符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同

三、实验题

实验程序

#include<

iostream>

usingnamespacestd;

typedefunsignedcharuchar;

intsum;

uchar**p;

//符号存储空间;

//表示满足要求的三角形个数

charch[2]={'

+'

'

-'

};

intn;

//第一行符号总数

inthalf;

intcount;

//用来计算‘-’的个数

voidBackTrace(intt)

{

if(t>

n)

{

sum++;

cout<

<

"

第"

sum<

个三角形:

endl;

for(inti=1;

i<

=n;

i++)

{

for(intj=1;

j<

i;

j++)

cout<

"

;

for(j=1;

=n-i+1;

ch[p[i][j]]<

cout<

}

}

else

for(inti=0;

=1;

p[1][t]=i;

//确定第一行第t个的值;

count+=i;

//用来计算‘-’的个数;

for(intj=2;

=t;

{

p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];

//第一行大于等于2时确定后面从第2行开始增加的一

count+=p[j][t-j+1];

//列中符号,计算‘-’个数;

}

if(count<

=half&

&

(t*(t+1)/2-count)<

=half)//约束条件;

BackTrace(t+1);

for(j=2;

j++)//回溯,判断另一种符号情况;

count-=p[j][t-j+1];

count-=p[1][t];

}

intmain()

cout<

请输入第一行符号的个数:

cin>

>

n;

count=0;

sum=0;

half=n*(n+1)/2;

if(half%2==0)

half=half/2;

p=newuchar*[n+1];

p[i]=newuchar[n+1];

memset(p[i],0,sizeof(uchar)*(n+1));

BackTrace

(1);

for(i=0;

delete[]p[i];

delete[]p;

满足要求的三角形符号共有:

个"

不存在这样的三角形符号!

return0;

四、实验结果

结果分析:

按题目要求输入数据,得出结果符合要求。

二:

0—1背包问题

1、掌握0—1背包问题的回溯算法

2、进一步掌握回溯算法

二、实验题:

给定n种物品和一背包。

物品i的重量是wi,其价值为vi,背包的容量为C。

问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

三、程序代码:

#include<

classKnap

friendintKnapsack(intp[],intw[],intc,intn);

public:

voidprint()

for(intm=1;

m<

m++)

bestx[m]<

};

private:

intBound(inti);

voidBacktrack(inti);

intc;

//背包容量

//物品数

int*w;

//物品重量数组

int*p;

//物品价值数组

intcw;

//当前重量

intcp;

//当前价值

intbestp;

//当前最优值

int*bestx;

//当前最优解

int*x;

//当前解

intKnap:

:

Bound(inti)

//计算上界

intcleft=c-cw;

//剩余容量

intb=cp;

//以物品单位重量价值递减序装入物品

while(i<

=n&

w[i]<

=cleft)

cleft-=w[i];

b+=p[i];

i++;

//装满背包

if(i<

=n)

b+=p[i]/w[i]*cleft;

returnb;

voidKnap:

Backtrack(inti)

if(i>

if(bestp<

cp)

for(intj=1;

bestx[j]=x[j];

bestp=cp;

return;

if(cw+w[i]<

=c)//搜索左子树

{x[i]=1;

cw+=w[i];

cp+=p[i];

Backtrack(i+1);

cw-=w[i];

cp-=p[i];

if(Bound(i+1)>

bestp)//搜索右子树

x[i]=0;

Backtrack(i+1);

classObject

friendintKnapsack(intp[],intw[],intc,intn);

intoperator<

=(Objecta)const

return(d>

=a.d);

intID;

floatd;

intKnapsack(intp[],intw[],intc,intn)

//为Knap:

Backtrack初始化

intW=0;

intP=0;

inti=1;

Object*Q=newObject[n];

for(i=1;

Q[i-1].ID=i;

Q[i-1].d=1.0*p[i]/w[i];

P+=p[i];

W+=w[i];

if(W<

=c)

returnP;

//装入所有物品

//依物品单位重量排序

floatf;

for(i=0;

for(intj=i;

if(Q[i].d<

Q[j].d)

f=Q[i].d;

Q[i].d=Q[j].d;

Q[j].d=f;

KnapK;

K.p=newint[n+1];

K.w=newint[n+1];

K.x=newint[n+1];

K.bestx=newint[n+1];

K.x[0]=0;

K.bestx[0]=0;

for(i=1;

K.p[i]=p[Q[i-1].ID];

K.w[i]=w[Q[i-1].ID];

K.cp=0;

K.cw=0;

K.c=c;

K.n=n;

K.bestp=0;

//回溯搜索

K.Backtrack

(1);

K.print();

delete[]Q;

delete[]K.w;

delete[]K.p;

returnK.bestp;

voidmain()

int*w;

intc=0;

intn=0;

inti=0;

请输入背包个数:

p=newint[n+1];

w=newint[n+1];

p[0]=0;

w[0]=0;

请输入各背包的价值:

cin>

p[i];

请输入各背包的重量:

w[i];

请输入背包容量:

c;

Knapsack(p,w,c,n)<

三、实验运行结果

实验小结:

实验很难,自己做不会,后来上网搜索资料,询问同学,在同学的帮助下,我逐渐学会了一些,对算法设计有了一些体会。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1