算法分析与设计方案验Word格式.docx

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

算法分析与设计方案验Word格式.docx

《算法分析与设计方案验Word格式.docx》由会员分享,可在线阅读,更多相关《算法分析与设计方案验Word格式.docx(10页珍藏版)》请在冰豆网上搜索。

算法分析与设计方案验Word格式.docx

故此时c[i][j]=0.其他情况下,由最优子结构性质可建立递归关系如下:

0i=0,j=0

c[i][j]=c[i-1][j-1]+1i,j>

0。

xi=yj

max{c[i][j-1],c[i-1][j]}i,j>

0-1背包问题:

设所给0-1背包问题的子问题

max∑nk=ivkxk

∑nk=ivkxk<

=j

xk∈{0.1},i<

=k<

=n

的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。

由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下:

m(i,j)=max{m(i+1,j),m(i+1,j-wi)+vi}j>

=wi

m(i+1,j)0<

=j<

wi

vnj>

=wn

m(n,j)=00<

wn

找零钱:

在这次实验中,由于听错实验的最后一个题目,所以找零钱的这个实验我是完全参照0-1背包问题的。

时间复杂度:

计算最优值c[i][j]的算法设计中,双层循环外规模为m,内规模为n,所以计算它的时间复杂度为0(mn).

0-1背包与找零钱:

由他的递归表达式可得时间复杂度为0(nc).

四、心得体会通过此次实验,我的最深感触就是对算法的思想一定要理解,不然只是徒劳。

刚开始做实验时,我什么也没看,直接拿着题目就凝思苦想,然而没有头绪。

在把课本上的东西看了之后,通过仔细查看动态规划的思想,我明白了如何规划问题,如何解决问题。

关键还是要做到心里有底,然后才能胸有成竹,

五、源程序清单。

#include<

iostream>

usingnamespacestd。

voidLCSLength(intm,intn,charx[],chary[],intc[][8],intb[][8])//求最优值

{

inti,j。

for(i=1。

i<

=m。

i++)c[i][0]=0。

for(i=1。

=n。

i++)c[0][i]=0。

i++)

for(j=1。

j<

j++)

{

if(x[i]==y[j])

{

c[i][j]=c[i-1][j-1]+1。

b[i][j]=1。

}

elseif(c[i-1][j]>

=c[i][j-1])

c[i][j]=c[i-1][j]。

b[i][j]=2。

else{

c[i][j]=c[i][j-1]。

b[i][j]=3。

}

}

voidLCS(inti,intj,charx[],intb[][8])//求最优解

if(i==0||j==0)return。

if(b[i][j]==1){

LCS(i-1,j-1,x,b)。

cout<

<

x[i]。

}

elseif(b[i][j]==2)LCS(i-1,j,x,b)。

elseLCS(i,j-1,x,b)。

intmain()

charx[8]。

chary[7]。

intc[8][8]={0}。

intb[8][8]={0}。

cout<

"

inputstringx"

endl。

//输入字符串x

for(inti=0。

9。

cin>

>

inputstringy"

//输入字符串y

for(intj=0。

8。

y[j]。

LCSLength(7,6,x,y,c,b)。

thebestvalue:

for(i=0。

=7。

{

for(intj=0。

=6。

cout<

c[i][j]。

最长公共子序列:

LCS(7,6,x,b)。

return0。

voidtback(intm[][11],intt[],intc,intn,intx[])。

voidknapsack(intv[],intw[],intc,intn,intm[][11])//最优值的求解过程

intjmax=(w[n]-1)>

c?

c:

(w[n]-1)。

=jmax。

m[n][j]=0。

for(j=w[n]。

=c。

m[n][j]=v[n]。

for(inti=n-1。

i>

=0。

i--)

{

jmax=(w[i]-1>

c)?

(w[i]-1)。

for(j=0。

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

for(j=w[i]。

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

(m[i+1][j-w[i]]+v[i])?

m[i+1][j]:

(m[i+1][j-w[i]]+v[i])。

m[1][c]=m[2][c]。

if(c>

=w[1])

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

(m[2][c-w[1]]+v[1])?

m[1][c]:

(m[2][c-w[1]]+v[1])。

inti,j,n=5,c,x[6],count=0。

intv[6]。

intw[6]。

inputarryv:

for(i=0。

6。

{x[i]=i。

v[i]。

arryvis:

v[i]<

inputarryw:

w[i]。

arrywis:

w[i]<

intm[7][11]={0}。

inputvolum:

cin>

c。

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

m[i][j]<

"

tback(m,w,c,n,x)。

theresultis:

n。

if(x[i])

{cout<

count++。

latestnumber="

count。

voidtback(intm[][11],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:

voidknapsack(intv[],intw[],intc,intn,intm[][11])//最优值

intu=(w[n]-1)>

=u。

u=(w[i]-1>

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

inti,j,n,c,x[6]={0},count=0。

intt[6]。

intco[6]。

inputthevalueofthecoin:

//输入硬币的面值

t[i]。

everycoinvalueis:

t[i]<

inputnumberofeverycoin:

//输入对应面值硬币的个数

co[i]。

thenumberofeverycoinis:

co[i]<

n=5。

inputthemoneyyouwanttochargewith:

输入要找的钱数

knapsack(co,t,c,n,m)。

tback(m,t,c,n,x)。

voidtback(intm[][11],intt[],intc,intn,intx[])//最优解

c-=t[i]。

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

当前位置:首页 > 外语学习 > 法语学习

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

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