河北工业大学算法实验报告Word格式.docx
- 文档编号:17527527
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:15
- 大小:143.11KB
河北工业大学算法实验报告Word格式.docx
《河北工业大学算法实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《河北工业大学算法实验报告Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
for(i=1;
i<
=n;
i++)
q[i]=2;
}
k=rand()%n;
if(k==0)
k=n;
q[k]=1;
cout<
"
随机产生的硬币排列顺序"
endl;
for(i=1;
cout<
q[i]<
;
if(i%5==0)
cout<
}
intp=findTheCoin(q,1,n);
伪造硬币的位置:
p<
======================="
}
intquantity(intq[],inta,intb)
inttotal=0;
for(i=a;
=b;
total+=q[i];
returntotal;
intfindTheCoin(intq[],inta,intb)
if(a==b)
returna;
intn=b-a+1;
intc=n%3;
intm=a+n/3-1;
intd;
switch(c)
case0:
if(quantity(q,a,m)==quantity(q,m+1,m+n/3))
{
d=findTheCoin(q,m+n/3+1,m+2*(n/3));
returnd;
}
elseif(quantity(q,a,m)==quantity(q,m+n/3+1,m+2*(n/3)))
d=findTheCoin(q,m+1,m+n/3);
else
d=findTheCoin(q,a,m);
//break;
case1:
if((quantity(q,a,m)==quantity(q,m+1,m+n/3))&
&
(quantity(q,m+n/3+1,m+2*(n/3))==quantity(q,m+1,m+n/3)))
returnm+2*(n/3)+1;
if(quantity(q,a,m)==quantity(q,m+1,m+n/3))
{
d=findTheCoin(q,m+n/3+1,m+2*(n/3));
returnd;
}
elseif(quantity(q,a,m)==quantity(q,m+n/3+1,m+2*(n/3)))
d=findTheCoin(q,m+1,m+n/3);
else
d=findTheCoin(q,a,m);
case2:
if(q[m+2*(n/3)+1]==q[m+2*(n/3)+2])
else
else
{
if(q[m+2*(n/3)+2]==q[1])
returnm+2*(n/3)+1;
//cout<
伪造硬币的号码是"
3*m+1<
returnm+2*(n/3)+2;
3*m+2<
//returntrue;
实验结果:
2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。
售货员希望用数目最少的硬币找给小孩。
假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。
给出一种找零钱的贪心算法。
(java程序)
publicclasszhaoling
publicstaticvoidmain(Stringargs[])
{
inti=67;
inta25=0,a10=0,a5=0,a1=0;
System.out.println("
要找的零钱:
+i+"
美分"
);
a25=(i/25);
a10=(i%25)/10;
a10=(i%25)%10/5;
1=(i%25)%10%5/1;
各面值张数为:
25美分的"
+a25+"
张"
10美分的"
+a10+"
5美分的"
+a5+"
1美分的"
+a1+"
实验二算法实现二
1."
0-1"
背包问题的贪心算法
#include"
stdio.h"
voidmain(void)
intC=6;
//背包容量6
intn=5;
//5个物品
intw[]={3,2,1,4,5};
//物品重量
intv[]={25,20,15,40,50};
//物品价值
intx[]={0,0,0,0,0};
//单位价值初始化
intq[5];
intm,i,j,p,vx,wx,k,ii;
intV=0;
//总价值初始化
//计算单位价值
printf("
单位价值为:
\n"
for(m=0;
m<
5;
m++)
q[m]=m;
x[m]=v[m]/w[m];
printf("
x[%d]=%d\t"
m,x[m]);
//冒泡排序
for(i=0;
4;
for(j=0;
j<
4-i;
j++)
if(x[j]<
x[j+1])
//交换单位价值
p=x[j];
x[j]=x[j+1];
x[j+1]=p;
//交换价值对应位置
vx=v[j];
v[j]=v[j+1];
v[j+1]=vx;
//交换重量对应位置
wx=w[j];
w[j]=w[j+1];
w[j+1]=wx;
//交换商品编号
m=q[j];
q[j]=q[j+1];
q[j+1]=m;
\n单位价值降序为:
i,x[i]);
//装入背包
n&
w[i]<
C;
if(w[i]<
=C)
V+=v[i];
C=C-w[i];
k=i;
if(C!
=0)
V+=v[i]*C/w[i];
C=0;
for(ii=0;
ii<
=k;
ii++)
\n放入第%d个物品:
\n物品的重量为:
%d\n物品的价值为:
%d\n背包剩余容量为:
%d\n"
q[ii]+1,w[ii],v[ii],C);
\n总价值为:
%d\t"
V);
本次实验是以贪心算法解决背包问题,贪心算法要求出每个物品的单位价值,根据单位价值降排列,再依次装入背包。
当最后一个物品不能完全装入时,装入部分使背包容量为0。
在本次实验中,遇到的难题是:
装入背包过程如何保证装入不完整物品,即背包剩余容量不能满足完全放入下一个物品。
通过本次试验又熟悉了冒泡算法的应用,以及多重for循环的应用。
2."
背包问题的动态规划算法
intn=5;
intw[]={0,3,2,1,4,5};
intv[]={0,25,20,15,40,50};
intx[5];
intV[6][7];
intC=6;
inti,j;
V[i][0]=0;
for(j=0;
=C;
V[0][j]=0;
for(j=1;
if(j<
w[i])
V[i][j]=V[i-1][j];
if(V[i-1][j]>
V[i-1][j-w[i]]+v[i])
V[i][j]=V[i-1][j];
else
V[i][j]=V[i-1][j-w[i]]+v[i];
//以上构造动态规划表
j=C;
for(i=n;
i>
0;
i--)
if(V[i][j]>
V[i-1][j])
x[i]=1;
j=j-w[i];
x[i]=0;
动态规划表如下:
6;
i++)
7;
printf("
%8d"
V[i][j]);
装入背包物品:
%4d"
x[i]);
\n背包取得最大值:
%4d\n"
V[n][C]);
这次实验用到的是动态规划法,0/1背包问题用动态规划法首先要构造动态规划表,用三个for语句实现;
根据动态规划表每行的最大值变化确定每个元素的装入与否,逐步确定出装入背包的物品,背包容量的最大值也就是动态规划表最右下角。
3."
背包问题的回溯算法
#include<
//定义min、max函数
intmin(inta,intb)
if(a>
=b)returnb;
elsereturna;
intmax(inta,intb)
=b)returna;
elsereturnb;
voidKnapsack(intv[6],intw[6],intc,intn,intm[6][6])//
intjmax=min(w[n]-1,c);
for(intj=0;
jmax;
m[n][j]=0;
for(intp=w[n];
=c;
p++)
m[n][p]=v[n];
for(inti=n-1;
1;
jmax=min(w[i]-1,c);
for(intj=0;
=jmax;
m[i][j]=m[i+1][j];
for(intt=w[i];
t<
t++)
m[i][t]=max(m[i+1][t],m[i+1][t-w[i]]+v[i]);
m[1][c]=m[2][c];
if(c>
=w[1])
m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
voidTraceback(intm[6][6],intw[6],intc,intn,intx[6])
for(inti=1;
n;
if(m[i][c]==m[i+1][c])x[i]=0;
else
x[i]=1;
c-=w[i];
x[n]=(m[n][c]!
=0)?
1:
intn1=5;
intc1=6;
intw1[6]={0,3,2,1,4,5};
intv1[6]={0,25,20,15,40,50};
intt[6][6];
intx1[6];
intm=0;
//cout<
请输入背包的容量:
//cin>
c1;
0-1背包如下:
物品的重量分别为:
for(intp=1;
w1[p]<
物品的价值分别为:
for(intq=1;
q<
q++)
v1[q]<
背包的容量为:
c1<
要选择的物品是:
Knapsack(v1,w1,c1,n1,t);
//for(inti=1;
=n1;
i++)cout<
v1[i]<
Traceback(t,w1,c1,n1,x1);
if(x1[i]==1){
m+=v1[i];
第"
件物品"
最大总价值为:
本次实验用回溯法解决0/1背包问题,回溯法首先要建立0/1背包的解空间树,然后再回溯得出搜素空间,即解的范围,然后求出最佳答案。
实验中先构造两个函数,Knapsack列出所有背包的解空间,Traceback对解空间进行搜索,得出答案。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北 工业大学 算法 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)