旅行商问题

news/2025/1/15 16:06:46/

数据结构可以分为线性结构、半线性结构、非线性结构。最基本的线性结构是序列。序列分为向量和列表。向量的逻辑次序称为秩,列表逻辑上相邻的数据项采用间接定址的方式通过封装后的位置相互引用。

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;const int N=21;//表示点的最大的数目
const int M=1<<N;//二进制状态的数字
int n;//点的数目
int f[M][N],weight[N][N];//f 的第一维表示状态,第二维表示目前到哪个点
//状态的意思就是当前哪些点被用过了,也就是说,1 表示被用过了,0 表示没被用过
//weight 表示权重,就是我们输入的那个东西int main(){scanf("%d",&n);for(int i=0;i<n;i++){for(int j=0;j<n;j++){scanf("%d",&weight[i][j]);}}memset(f,0x3f,sizeof f);//因为是求最小值,所以初始的时候就//初始化为正无穷f[1][0]=0;//表示 0 这个点被用了,但是还没有移动,所以是 0//下面是关键for(int i=0;i<1<<n;i++){//枚举所有的状态for(int j=0;j<n;j++){//枚举每一个点if(i>>j&1){//位运算常用的,这个是看啥,看不懂,这里表示的是// j 这个点用过了,那是为啥呢for(int k=0;k<n;k++){//枚举的是另外一个点if(i>>k&1){//我感觉有点奇怪,这不是表示 k 这个点被用过了吗//哦哦,转移之后确实被用过了f[i][j]=min(f[i][j],f[i-(1<<j)][k]+weight[k][j]);}//这个位运算记住就好了,给我的感觉就是减掉一个 1}//比如说 i=1011 ,然后 j=1000 ,减掉之后就是 11 ,应该是这个意思}}}printf("%d\n",f[(1<<n)-1][n-1]);//有优先级的问题,记得要加括号//就是二进制数字全是 1 ,表示所有点都走过了,然后刚好到终点,就是答案return 0;
}

这题对我来说是真的难。想放弃了都。题解看了两三遍。硬是看不明白。现在大概懂一点点了。就是我们把第一维看作是二进制压缩的状态。然后第二维表示的是当前的点是哪个点。当前的点一定要在前面的状态里面表示为 1 1 1 。这个是啥意思呢。就是因为我们要算这个点,虽然是算完这个点才把这个点算作已经用完了。但是我们得先把这个点标记为 1 1 1 才能算这个点。我个人感觉有点像先斩后奏,或者先上车后补票的感觉。然后的话,我们枚举了两个点,从 k 这个点走到 j 这个点。需要 j 这个点没有被用过,才能转移。假设 j 这个点被用过了,再转移,就至少是第二次经过 j 这个点。不符合题意。难住我的还有位运算。因为我接触这个东西比较少。看到很陌生。然后就差不多了,结合注释也基本能理解意思了。


http://www.ppmy.cn/news/1563359.html

相关文章

宁德时代C++后端开发面试题及参考答案

请阐述面向对象的三大特性。 面向对象编程有三大特性,分别是封装、继承和多态。 封装是指将数据和操作数据的方法绑定在一起,对数据的访问和操作进行限制。这样做的好处是可以隐藏对象的内部细节,只暴露必要的接口给外部。例如,我们可以把一个汽车类的内部引擎状态、速度等…

【拒绝算法PUA】3065. 超过阈值的最少操作数 I

系列文章目录 【拒绝算法PUA】0x00-位运算 【拒绝算法PUA】0x01- 区间比较技巧 【拒绝算法PUA】0x02- 区间合并技巧 【拒绝算法PUA】0x03 - LeetCode 排序类型刷题 【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中 C刷题技巧总结&#xff1a; [温习C/C]0x04 刷…

Vue3学习-day4

父子通信 父传子 App.vue <script setup> // 局部组件(直接导入就能用&#xff0c;不用注册)import sonFirst from ./components/son-First.vue // 父传子 // 1. 给子组件&#xff0c;添加属性的方式传值 // 2. 在子组件&#xff0c;通过 props 接收 import {ref} fr…

milvus过滤功能

数据格式: [{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},{"id": 1, "vecto…

在 WSL 中使用 Jupyter Notebook 的 TensorBoard 启动问题与解决方法

在 WSL&#xff08;Windows Subsystem for Linux&#xff09;环境中&#xff0c;通过 Jupyter Notebook 使用 %tensorboard --logdir outputs有时会出现 “Timed out waiting for TensorBoard to start” 错误。常见原因通常是先前的 TensorBoard 进程尚未结束&#xff0c;占用…

摄像头开发新品种观鸟技术

摄像头工业产品的开发是一个复杂且精细的过程&#xff0c;涉及多个环节和技术领域。以下是对摄像头工业产品开发流程的详细分析&#xff1a; 一、前期准备 1. **市场调研**&#xff1a;了解市场需求、竞争对手的产品特点和市场占有率&#xff0c;以及潜在用户的使用习惯和需求…

Java-数据结构-栈与队列(常考面试题与单调栈)

在上一篇的学习中&#xff0c;我们学习了栈和队列的基本知识&#xff0c;以及它们对应都有哪些方法&#xff0c;在什么应用场景下如何使用&#xff0c;并且还对它们进行了模拟实现&#xff0c;而其实对于栈和队列的相关知识还远不止于此&#xff0c;而今天我们就对栈与队列进行…

C++内存泄露排查

内存泄漏是指程序动态分配的内存未能及时释放&#xff0c;导致系统内存逐渐耗尽&#xff0c;最终可能造成程序崩溃或性能下降。在C中&#xff0c;内存泄漏通常发生在使用new或malloc等分配内存的操作时&#xff0c;但没有正确地使用delete或free来释放这块内存。 在日常开发过程…