算法设计与分析实验二:动态规划法实现TSP问题和0/1背包问题

本文介绍了如何使用动态规划方法解决旅行商问题(TSP)和0/1背包问题。实验详细阐述了TSP问题的动态规划算法,通过构建过程矩阵寻找从特定顶点出发,经过子集的最短路径。同时,文章还探讨了0/1背包问题的动态规划解法,讨论了在不同容量限制下,如何选择物品以达到最大价值。
摘要由CSDN通过智能技术生成

【实验目的】
1、熟练掌握动态规划思想及教材中相关经典算法。
2、使用动态规划法编程,求解0/1背包问题和TSP问题。

TSP问题

一、实验内容:
TSP问题是指旅行家要旅行n个城市,要求每个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。
对于图G=(V,E),假设从顶点i出发,令V’=V-i,则d(i,V’)表示从顶点i出发经过V’中各个顶点一-次且仅一次,最后回到出发点i的最短路径长度,显然,初始子问题是d(k,{}),即从顶点i出发只经过顶点k回到顶点i。现在考虑原问题的一部分,d(k,V’-{k})表示从顶点k出发经过V’-{k}中各个顶点一次且仅一次,最后回到出发点i的最短路径长度,则:
d(k, {}) = c[k][i]
d(i, V’) = min{c[i][k]+d(k,V’- {k})}(k∈V’)
如图为最近邻点贪心策略求解TSP问题的过程。
在这里插入图片描述
在这里插入图片描述
假设n个顶点分别用0n-1的数字编号,顶点之间的代价存放在数组arcrnT[n]中,下面考虑从顶点0出发求解TSP问题的填表形式。首先,按个数为1、2、…n1的顺序生成1n-1个元素的子集存放在数组V[2^(n-1)]中。
例如当n=4时,V[1]={1},V[2]={2},V[3]={3},V[4]={1,2},V[5]={1,3},V[6]={2,3},V[7]={1,2,3}。设数组d[n][2^(n-1)]存放迭代结果,其中d[i][j]表示从顶点i经过子集V[j]中的顶点一次且仅一次,最后回到出发点0的最短路径长度,动态规划法求解TSP问题的算法如下。
在这里插入图片描述
三、实验源程序及结果截图:
1、实验代码:

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
   
	int n,i,j,k,m=1;
	cout<<"请输入顶点个数:\n";
	cin>>n;
	for(i=1;i<n;i++){
   //n个顶点有m个子集,m=2^(n-1)
		m=m*2;
	} 
	int **arc=new int*[n];//图的代价矩阵
	for(i=0;i<n;i++){
    
		arc[i]=new int[n];
	} 
	int **d=new int*[n];//存放迭代结果,即过程矩阵
	for(i=0;i<n;i++){
    
		d[i]=new int[m];
	} 
	cout<<"请输入带权图的代价矩阵:"<<endl;
	for(i=0;i<n;i++){
   
		for(j=0;j<n;j++){
   
			cin>>arc[i][j];
		}			
	}		
	//纠正用户输入的数据
	for(i=0;i<n;i++)
		arc[i][i]=-1;
	//初始化第0列
	for(i=0;
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值