#include <iostream>
#include <cmath>
using namespace std;
//集合虚拟化用000 、001 、010 、011 、100 、101 、110 、111分别表示{} 、{1}(V[2^(1-1)]) 、{2}(V[2^(2-1)]) 、{1,2}(V[2^(1-1)+2^(2-1)]) 、{3}(V[2^(3-1)]) 、{1,3}(V[2^(1-1)+2^(3-1)]) 、{2,3}(V[2^(2-1)+2^(3-1)]) 、{1,2,3}(V[2^(1-1)+2^(2-1)+2^(3-1)])注意{1,2} 、{3}顺序
//这是本题的难点,将十进制数转化为二进制
//①直观的看出来包含的元素②可以直接用编码表示这个集合
int distanceTable[100][100];//需要填的表格
int distanceMatrix[10][10];//城市距离的代价矩阵
int N;//城市数量
int path[100][100];//若path[i][j] = k,则说明从i到集合V[j]的最短距离是从i到集合V[j]中的k
int cinDistance(){//输入代价矩阵cout<<"请输入城市个数"<<endl;cin>>N;cout<<"请输入城市距离的代价矩阵"<<endl;for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j) {cin>>distanceMatrix[i][j];}}for (int k = 0; k < N; ++k) {//规范distanceMatrix[k][k] = 0;}cout<<"您的代价矩阵已被规范化"<<endl;for (int i = 0; i < N; ++i) {for (int j = 0; j < (int)pow(2,N); ++j) {distanceTable[i][j] = -1;}}return 0;
}int exist(int i,int j){//判断集合V[j]中是否有元素i,有则返回1if((int)pow(2,i - 1)&j)return 1;else return 0;
}int TSP(){for (int i = 1; i < N; ++i) {//初始化第0列,i为行数distanceTable[i][0] = distanceMatrix[i][0];}
//第一步,先不填最后一个空,先填前面的for (int j = 1; j < (int)pow(2,N - 1); ++j) {//从第一列开始填表,j为列数for (int i = 1; i < N; ++i) {//从第一行开始int min = 10000;if(!exist(i,j)){//如果集合V[j]中没有元素i,则求i到V[j]再到0的最短路径for (int k = 1; k < N; ++k) {if(exist(k,j)){//如果k存在集合V[j]中,则求i到k + (k再到0的最短距离)//int d = distanceMatrix[i][k] + distanceTable[k][j - (int)pow(2,k - 1)];//这一行很难理解,为什么V[j]中除掉看,就是//集合V[j - (int)pow(2,k - 1)]呢,因为 例如V[5]={1,3}他的编码是101,如果去掉3,即是101 - 2的3次方 = 101 - 100 = 001,可知集合只剩下1了,所以就是集合001了V[1]/if(d < min){path[i][j] = k;//即从i到V[j]再到0的最短距离是先从i到kmin = d;}}}distanceTable[i][j] = min;}}}
//填最后一个空也就是求最短路径长度,并求最短路径int min = 1000;for (int k = 1; k < N; ++k) {int d = distanceMatrix[0][k] + distanceTable[k][((int)pow(2,N - 1) - 1) - (int)pow(2,k - 1)];if(d < min){min = d;path[0][(int)pow(2,N - 1) - 1] = k;}}distanceTable[0][((int)pow(2,N - 1) - 1)] = min;return 0;
}int coutResult(){for (int i = 0; i < N; ++i) {//输出表格for (int j = 0; j < (int)pow(2,N - 1); ++j) {cout<<distanceTable[i][j]<<'\t';}cout<<endl;}//输出路径cout<<"0->";int i = 0;for (int j = (int)pow(2,N - 1) - 1; j > 0;) {i = path[i][j];cout<<i<<"->";j = j - (int)pow(2,i - 1);}cout<<"0"<<endl;return 0;
}int main()
{cinDistance();TSP();coutResult();return 0;
}

算法设计TSP问题动态规划相关推荐

  1. (十三)算法设计思想之“动态规划”

    算法设计思想之"动态规划" 动态规划是什么? 动态规划的步骤 LeetCode:70.爬楼梯 LeetCode:198.打家劫舍 思考题 动态规划是什么? 动态规划是算法设计中的一 ...

  2. 算法设计与分析-----动态规划

    算法设计与分析-----动态规划(c语言) 一.动态规划 1.定义 2.动态规划问题的解法 3.动态规划求解的基本步骤 4.动态规划与其他方法的比较 5.求解整数拆分问题 6.求解最大连续子序列和问题 ...

  3. 算法设计与分析——动态规划(二):钢条切割

    分类目录:<算法设计与分析>总目录 相关文章: · 动态规划(一):基础知识 · 动态规划(二):钢条切割 · 动态规划(三):矩阵链乘法 · 动态规划(四):动态规划详解 · 动态规划( ...

  4. 算法设计与分析——动态规划(五):最长公共子序列

    分类目录:<算法设计与分析>总目录 相关文章: · 动态规划(一):基础知识 · 动态规划(二):钢条切割 · 动态规划(三):矩阵链乘法 · 动态规划(四):动态规划详解 · 动态规划( ...

  5. 算法设计与分析——动态规划——数字三角形问题

    数字三角形问题 1.题目描述:给定一个由n行数字组成的数字三角形,如图3-7所示.设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 算法设计:对于给定的由n行数字组成的数字 ...

  6. 算法设计与分析——动态规划(一)矩阵连乘

    动态规划--Dynamic programming,可以说是本人一直没有啃下的骨头,这次我就得好好来学学Dynamic programming. OK,出发! 动态规划通常是分治算法的一种特殊情况,它 ...

  7. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

  8. 算法设计与分析—动态规划算法

    动态规划算法 1.动态规划算法基本思想 2.动态规划算法求解步骤 3. 0-1背包问题 在现实生活中,存在这样一类问题,它们的活动过程不仅可以分成若干阶段,而且在任意一个阶段(不妨设为第i个阶段)以后 ...

  9. 算法设计与分析——动态规划——石子合并问题

    1.石子合并问题 在一个圆形操场的四周摆放着n堆石子.现要将石子有序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.设计一个算法,计算出将n堆石子合并成 ...

最新文章

  1. HashMap和Hashtable及HashSet的区别
  2. 【Ubuntu入门到精通系列讲解】常用 Linux 命令的基本使用
  3. narwal无法连接机器人_懒无止境 能自己洗抹布的云鲸J1扫拖机器人
  4. 经典C语言程序100例之六
  5. JSP慕课网阶段用户登录小例子(不用数据库)
  6. scrapy crawlspider
  7. GridView 高级技术
  8. concurrentbag 删除指定元素_Python实现列表索引批量删除的5种方法_python
  9. 【Kettle】Win7启动Spoon.bat闪退
  10. 牛客——数据库实战(1~30)
  11. 蓝桥杯2015年第六届C/C++省赛C组第一题-隔行变色
  12. 自己编写的中文字符串的截取函数
  13. linux最大lun空间,Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)
  14. 星空投影夜灯-隐私政策协议
  15. MySQL数据库表数据迁移--ibd的使用
  16. Test: Windows Live Writer for Cnblogs
  17. 搞事情 | 众编程语言齐聚密谋:如何推翻java的统治地位!
  18. 明辰智航网络一点通网络性能测试仪可以做什么
  19. Python语法基础(三)
  20. 下一个颠覆的领域:区块链如何影响审计行业?(中)

热门文章

  1. 【iCore1S 双核心板_ARM】例程三:EXTI中断输入实验——读取ARM按键状态
  2. 分析Linux文件rwx属性的含义
  3. maven实现多模块热部署
  4. 如何利用python自动化办公项目_python办公自动化:自动进行word文档处理和排版
  5. 内网安装nginx+keepalived环境配置及简单使用
  6. Redmine数据库备份及搬家
  7. java set方法赋值_java方面:private属性,没有set方法,只有get方法,如何给这个属性赋值?...
  8. oracle schema_oracle数据库全局统计更新
  9. python ftp下载文件_文件上传下载Python
  10. rad linux下安装mysql_Linux(CentOS或RadHat)下MySQL源码安装