算法实验报告Word文件下载.docx

上传人:b****3 文档编号:6558287 上传时间:2023-05-06 格式:DOCX 页数:22 大小:82.28KB
下载 相关 举报
算法实验报告Word文件下载.docx_第1页
第1页 / 共22页
算法实验报告Word文件下载.docx_第2页
第2页 / 共22页
算法实验报告Word文件下载.docx_第3页
第3页 / 共22页
算法实验报告Word文件下载.docx_第4页
第4页 / 共22页
算法实验报告Word文件下载.docx_第5页
第5页 / 共22页
算法实验报告Word文件下载.docx_第6页
第6页 / 共22页
算法实验报告Word文件下载.docx_第7页
第7页 / 共22页
算法实验报告Word文件下载.docx_第8页
第8页 / 共22页
算法实验报告Word文件下载.docx_第9页
第9页 / 共22页
算法实验报告Word文件下载.docx_第10页
第10页 / 共22页
算法实验报告Word文件下载.docx_第11页
第11页 / 共22页
算法实验报告Word文件下载.docx_第12页
第12页 / 共22页
算法实验报告Word文件下载.docx_第13页
第13页 / 共22页
算法实验报告Word文件下载.docx_第14页
第14页 / 共22页
算法实验报告Word文件下载.docx_第15页
第15页 / 共22页
算法实验报告Word文件下载.docx_第16页
第16页 / 共22页
算法实验报告Word文件下载.docx_第17页
第17页 / 共22页
算法实验报告Word文件下载.docx_第18页
第18页 / 共22页
算法实验报告Word文件下载.docx_第19页
第19页 / 共22页
算法实验报告Word文件下载.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

算法实验报告Word文件下载.docx

《算法实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法实验报告Word文件下载.docx(22页珍藏版)》请在冰点文库上搜索。

算法实验报告Word文件下载.docx

>

n;

请输入真币和伪造硬币的重量"

t>

f;

for(i=0;

i<

size;

i++)//初始化数组

a[size]=0;

i++)

a[i]=t;

k=rand()%n;

//随机产生假硬币的下标

a[k]=f;

随机产生的伪造硬币的位置"

k<

随机产生的硬币排列顺序"

//输出原始数组

{

a[i]<

"

;

if((i+1)%20==0)

}

m=weight(0,n-1);

if(m==-1)

没有伪造硬币"

else

伪造硬币的位置是"

m<

return0;

}

//称重函数m,n分别为数组的最小及最大下标,每次把硬币等分三堆

intweight(intm,intn){

intj=0;

inti=0;

intsum1=0;

intsum2=0;

intsum3=0;

if(m>

=n)

return-1;

for(i=0;

(n-m+1)/3;

i++,j++)

sum1+=(a[m+j]);

sum2+=(a[m+(n-m+1)/3+j]);

sum3+=(a[m+2*(n-m+1)/3+j]);

}

//数组元素个数除三余一的情况

if(((n-m+1)%3)==1)

if(sum1==sum2)

if(sum1==sum3)

if(a[n]==a[n-1])

return-1;

returnn;

m=m+2*((n-m+1)/3);

weight(m,n);

m=m+(n-m+1)/3;

n=m+2*((n-m+1)/3)-1;

n=m+(n-m+1)/3-1;

//数组元素个数除三余二的情况

else

if(((n-m+1)%3)==2)

{

if(a[n]==a[n-2])

if(a[n-1]==a[n-2])

returnn-1;

m=m+2*((n-m+1)/3);

//数组元素个数被三整除的情况

实验结果

2.找零钱问题

源程序如下:

iostream.h>

{

intmoney,value,returns;

inttwenty_five,ten,five,one;

inti,j,k,l;

i=0;

j=0;

k=0;

l=0;

money=100;

value=33;

returns=money-value;

cout<

***应该找给孩子的钱是(美分):

returns<

***请输入现有的25美分,10美分,5美分,1美分硬币的个数***"

cin>

twenty_five>

ten>

five>

one;

i=returns/25;

if(i<

=twenty_five)

returns-=25*i;

else

returns-=twenty_five*25;

i=twenty_five;

if(returns>

0)

j=returns/10;

if(j<

=ten)

returns-=10*j;

returns-=ten*10;

j=ten;

k=returns/5;

if(k<

=five)

returns-=5*k;

returns-=five*5;

k=five;

l=returns;

if(l<

=one)

returns-=l;

returns-=one;

l=one;

if((returns=returns-(i*25+j*10+k*5+l))>

不好意思,现在没有足够的硬币!

***应找25美分的个数是:

***应找10美分的个数是:

j<

***应找5美分的个数是:

***应找1美分的个数是:

l<

return0;

实验结果:

实验二:

通过本实验加深对贪心算法、动态规划和回溯算法的理解。

掌握贪心算法、动态规划和回溯算法的概念和基本思想,分析并掌握"

0-1"

背包问题的三种算法,并分析其优缺点。

1."

背包问题的贪心算法

2."

背包问题的动态规划算法

3."

背包问题的回溯算法

四.1

背包问题的贪心算法源程序:

algorithm>

structgood//表示物品的结构体

doublep;

//价值

doublew;

//重量

doubler;

//价值与重量的比

}a[200];

doubles,value,m,result;

inti,n;

boolbigger(gooda,goodb)

returna.r>

b.r;

printf("

----------背包问题之贪心算法------------------\n"

);

输入物品个数:

scanf("

%d"

&

n);

//物品个数

输入物品的重量和价值:

for(i=0;

%lf%lf"

a[i].w,&

a[i].p);

a[i].r=a[i].p/a[i].w;

sort(a,a+n,bigger);

//调用sort排序函数,你大概不介意吧,按照价值与重量比排序贪心

输入背包的容量;

%lf"

m);

//读入包的容量m

s=0;

//包内现存货品的重量

value=0;

//包内现存货品总价值

result=0;

n&

&

(s+a[i].w)<

=m;

{value+=a[i].p;

s+=a[i].w;

result=value*s;

背包内物品总价值为:

%.2lf.\n"

result);

//输出结果

运行结果:

2

背包问题的动态规划算法源程序

iomanip>

vector>

voidKnapsack(vector<

int>

vct_v,vector<

vct_w,intc,intn);

voidprint(vector<

v);

voidprintarr(vector<

vector<

>

m,intp,intq);

voidTraceback(vector<

m,vector<

voidmain()

intmo=10;

vector<

vct_w;

vct_v;

intc,n,v,w;

***0-1背包问题之动态规划***"

***请输入物品个数***"

srand((unsigned)time(NULL));

vct_w.push_back(n);

//第一个位置存放物品个数

for(inti=1;

=n;

w=rand()%mo+1;

vct_w.push_back(w);

vct_v.push_back(n);

for(i=1;

v=rand()%mo+10;

vct_v.push_back(v);

***请输入背包容量***"

c;

***请输入物品重量***"

print(vct_w);

***请输入物品价值***"

print(vct_v);

Knapsack(vct_v,vct_w,c,n);

v)

v.size();

cout<

setw(3)<

v[i]<

m,intp,intq)

=p;

for(intj=1;

=q;

j++)

cout<

m[i][j]<

}

vct_w,intc,intn)

m(n+1,vector<

(c+1));

intjMax;

for(inti=0;

i++)//为每一行分配空间

jMax=vct_w[n]-1<

c?

vct_w[n]-1:

c;

for(intj=0;

=jMax;

m[n][j]=0;

for(j=vct_w[n];

=c;

m[n][j]=vct_v[n];

for(i=n-1;

i>

1;

i--)

intjMax=vct_w[i]-1<

c?

vct_w[i]-1:

for(intj=0;

m[i][j]=m[i+1][j];

for(j=vct_w[i];

m[i][j]=m[i+1][j]>

m[i+1][j-vct_w[i]]+vct_v[i]?

m[i+1][j]:

m[i+1][j-vct_w[i]]+vct_v[i];

m[1][c]=m[2][c];

if(c>

=vct_w[1])

m[1][c]=m[1][c]>

m[2][c-vct_w[1]]+vct_v[1]?

m[1][c]:

m[2][c-vct_w[1]]+vct_v[1];

***m列表内容***"

printarr(m,n,c);

Traceback(m,vct_w,c,n);

x;

x.push_back(0);

if(m[i][c]==m[i+1][c])

x.push_back(0);

else

{x.push_back

(1);

c-=vct_w[i];

x.push_back((m[n][c])>

0?

1:

0);

***动态规划所得的最优解为***"

x.size();

x[i]<

3

背包问题的回溯算法源程序

#include<

iomanip.h>

string.h>

intmin(intw,intc)

{inttemp;

if(w<

c)temp=w;

temp=c;

returntemp;

intmax(intw,intc)

inttemp;

if(w>

voidknapsack(intv[],intw[],intc,intn,int**m)//求最优值

intjmax=min(w[n]-1,c);

=jmax;

m[n][j]=0;

for(intjj=w[n];

jj<

jj++)

m[n][jj]=v[n];

for(inti=n-1;

i--){//递归部分

jmax=min(w[i]-1,c);

m[i][j]=m[i+1][j];

for(intjj=w[i];

m[i][jj]=max(m[i+1][jj],m[i+1][jj-w[i]]+v[i]);

=w[1])

m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);

最优值:

m[1][c]<

for(intl=2;

l++)

m[l][j]<

setw(c-1);

*******************************************"

inttraceback(int**m,intw[],intc,intn,intx[])//回代,求最优解

得到的一组最优解如下:

if(m[i][c]==m[i+1][c])x[i]=0;

else{x[i]=1;

c-=w[i];

x[n]=(m[n][c])?

1:

0;

for(inty=1;

y<

y++)

setw(5)<

x[y];

returnx[n];

main()

intn,c;

int**m;

------------------0-1背包问题之回溯--------------------"

请输入物品个数和重量上限:

n>

int*v=newint[n+1];

输入各物品价值(v[i]):

v[i];

int*w=newint[n+1];

输入各物品重量(w[i]):

for(intj=1;

w[j];

int*x=newint[n+1];

m=newint*[n+1];

//动态的分配二维数组

for(intp=0;

p<

n+1;

p++)

m[p]=newint[c+1];

knapsack(v,w,c,n,m);

traceback(m,w,c,n,x);

部分:

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2