您好,欢迎来到客趣旅游网。
搜索
您的当前位置:首页算法设计与分析动态规划实验

算法设计与分析动态规划实验

来源:客趣旅游网



5

实验内容

1.最长公共子序列问题(LCS)。在使用动态规划算法来求解最长公共子序列时,二维数组c[i][j]用于记录序列XiYj的最长公共子序列的长度,对于序列X= {A, C, B, C, D, A, B, D}Y= {A, B, D, C, A, B, A},绘制对应的c[i][j]

所绘制的c[i][j]数组:

0

A

C

B

C

D

A

B

D

0

0

0

0

0

0

0

0

0

0

A

0

1

1

1

1

1

2

2

2

B

0

1

1

2

2

2

2

3

3

D

0

1

1

1

1

2

2

2

3

C

0

1

2

2

3

3

3

3

3

A

0

2

2

2

2

2

3

3

3

B

0

2

2

3

3

3

3

4

4

A

罿0

3

3

3

3

3

4

4

4

2.最长公共子序列问题(LCS)。使用动态规划算法求解最长公共子序列。【输入:两个字符序列;输出:两个字符序列的最长公共子序列。例如:输入序列A= "ABCBDAB",序列B= "BDCABA";输出"BCAB"(或其他任意一条长度为4的公共子序列)】

源代码:

#include<iostream>




#include<string>

#include<iomanip>

using namespace std;

int dp[1000][1000];

string str1,str2,s1,s2;

int max(int a,int b,int c)

{

if(a>b && a>c)

return a;

if(b>a && b>c)

return b;

if(c>a && c>b)

return c;

}

int lcs(int len1,int len2)

{

memset(dp,0,sizeof(dp));

int i,j,x;

dp[0][1]=0;




dp[1][0]=0;

dp[1][1]=0;

dp[0][0]=0;

for(i=2;i<len1+2;i++)

{

dp[i][1]=-2*(i-1);

}

for(j=2;j<len2+2;j++)

{

dp[1][j]=-2*(j-1);

}

for(j=2;j<len2+2;j++)

{

for(i=2;i<len1+2;i++)

{

if(str1[i-2]==str2[j-2])

x=dp[i-1][j-1]+5;

else

x=dp[i-1][j-1]-1;

dp[i][j]=max(x,dp[i-1][j]-2,dp[i][j-1]-2);

}

}




return dp[i-1][j-1];

}

void print(int len1,int len2)

{

int i,j;

i=len1+1;

j=len2+1;

while(i>1 && j>1)

{

if(dp[i][j]+2==dp[i-1][j])

{

s2=s2+'_';

s1=s1+str1[i-2];

i--;

continue;

}

if(dp[i][j]+2==dp[i][j-1])

{

s1=s1+'_';

s2=s2+str2[j-2];




j--;

continue;

}

if(dp[i][j]+1==dp[i-1][j-1] || dp[i][j]-5==dp[i-1][j-1])

{

s1=s1+str1[i-2];

s2=s2+str2[j-2];

j--;

i--;

continue;

}

}

for(i=len1-1;i>=0;i--)

{

cout<<s1[i];

}

cout<<endl;

for(j=len1-1;j>=0;j--)

{

cout<<s2[j];

}




cout<<endl;

}

int main()
{
int len1,len2;
while(cin>>str1>>str2)
{
len1=str1.size();
len2=str2.size();
cout<<lcs(len1,len2)<<endl;
for(int i=1;i<=len1+1;i++)
{
for(int j=1;j<=len2+1;j++)
{
cout<<setw(5)<<dp[i][j]<<" "; }
cout<<endl;
}
print(len1,len2);

}
return 0;
}

3.0-1背包问题。在使用动态规划算法求解0-1背包问题时,使用二维数组m[i][j]存储背包剩余容量为j,可选物品为ii+1……n0-1背包问题的最优值。绘制价值数组v= {8, 10, 6, 3, 7, 2},重量数组w= {4, 6, 2, 2, 5, 1},背包容量C= 12时对应的m[i][j]数组。

所绘制的m[i][j]数组:

w

v








4

8








6

10








2

6








2

3








5

7











1

2








4.0-1背包问题。给定n种物品和一个背包,物品i的重量是Wi,其价值为

Vi,背包的容量为C。如何选择装入背包的物品,可以使得装入背包中物品的总

价值最大?【输入:两个一维数组分别用于存储每一种物品的价值和重量,以及

一个整数表示背包的容量。例如:价值数组v[]= {6,3,6,5,4},重量数组w[]=

{2,2,4,6,5},背包容量C=10输出:背包的最大总价值和所选取的物品。例如:

最大总价值=15,物品选取策略为10011。】

源代码:

#include<stdio.h>

int c[10][100];/*对应每种情况的最大价值*/

int knapsack(int m,int n)

{

int i,j,w[10],p[10];

printf("请输入每个物品的重量,价值:\n");

for(i=1;i<=n;i++)

scanf("%d,%d",&w[i],&p[i]);

for(i=0;i<10;i++)

for(j=0;j<100;j++)

c[i][j]=0;/*初始化数组*/

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

{

if(w[i]<=j) /*如果当前物品的容量小于背包容量*/

{




if(p[i]+c[i-1][j-w[i]]>c[i-1][j])

/*如果本物品的价值加上背包剩下的空间能放的物品的价值

*/

/*大于上一次选择的最佳方案则更新c[i][j]*/

c[i][j]=p[i]+c[i-1][j-w[i]];

else

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

}

else c[i][j]=c[i-1][j];

}

return(c[n][m]);

}

int main()

{

int m,n;int i,j;

printf("请输入背包的承重量,物品的总个数:\n");

scanf("%d,%d",&m,&n);

printf("旅行者背包能装的最大总价值为%d",knapsack(m,n));




printf("\n");

return 0;

}

5*.对最长公共子序列问题的动态规划算法进行改进,输出所有最长公共子序列。

源代码:


6*.某工厂预计明年有ABCD四个新建项目,每个项目的投资额Wk及其投资后的收益Vk如下表所示,投资总额为30万元,如何选择项目才能使总收益最大?【0-1背包问题】

Project

Wk

Vk

A

15

12

B

10

8

C

12

9

D

8

5

源代码:


说明:
(1)编程语言不限,建议使用JavaC++或者C语言。

(2)需要将程序源代码复制并粘贴到每道题之后的方框中(部分题需要填写输出结果)。

(3)在提交实验报告时,先关闭所有文件,再将文件名改为学号-5.doc”;。

Copyright © 2019- kqyc.cn 版权所有 赣ICP备2024042808号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务