计算机算法与设计分析实验报告徐绍东4Word文档格式.docx
《计算机算法与设计分析实验报告徐绍东4Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机算法与设计分析实验报告徐绍东4Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
符号三角形问题要求对于给定的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)<
三、实验运行结果
实验小结:
实验很难,自己做不会,后来上网搜索资料,询问同学,在同学的帮助下,我逐渐学会了一些,对算法设计有了一些体会。