递归剪枝题

期中考终于考完了,整道题奖励下自己

我一北大同学问我的,说他递归超时了,叫我想一个办法

后面他说他加了个剪枝就过了,然后我自己尝试了一个方法:

就是先把城市按1到n排列,然后考虑互换,如果互换后更便宜就换

这样下去的排列一直最优化进行

最后不能最优的时候就ok了

代码如下:

#include<stdio.h>
int cost[16][16];
int r[16];//routeint main(void)
{int n, m = 0, count = 1;scanf("%d", &n);for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)scanf("%d", &cost[i][j]);r[i] = i;}//先计算总价钱mfor(int i = 1; i < n; i++)m += cost[i][i + 1];m += cost[1][n];//开始找最优解while(count){count = 0;for(int b = 1; b < n; b++){int a = (b == 1) ? n : b - 1;int c = b + 1;for(int e = b + 1; e <= n; e++){int d = e - 1;int f = (e == n) ? 1 : e + 1;int former = cost[r[a]][r[b]] + cost[r[b]][r[c]] + cost[r[d]][r[e]] + cost[r[e]][r[f]];r[b] ^= r[e] ^= r[b] ^= r[e];int later = cost[r[a]][r[b]] + cost[r[b]][r[c]] + cost[r[d]][r[e]] + cost[r[e]][r[f]];if(former > later){m -= former - later;count++;}elser[b] ^= r[e] ^= r[b] ^= r[e];}}}printf("%d", m);return 0;
}

想象很美好,结果呢?

没过

因为如果互换后价格一样,你是换还是不换?

考虑换的话可能最后不是最优,不换的话最后也可能不是最优

所以两个都要试一下

这样就不如递归剪枝

(注:a ^= b ^= a ^= b; 可以使二者互换,但是使用场景较少)

代码如下:

#include<stdio.h>
void dg(int x, int c);
int cost[16][16], city[16], r[16];//city route
int n, m;int main(void)
{scanf("%d", &n);for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)scanf("%d", &cost[i][j]);//先计算总价钱mfor(int i = 1; i < n; i++)m += cost[i][i + 1];m += cost[1][n];dg(1, 0);printf("%d", m);return 0;
}
void dg(int x, int c)//c为cost
{for(int i = 1; i <= n; i++)if(!(city[i])){if(x == 1){city[i] = 1, r[x] = i;dg(x + 1, 0);city[i] = 0, r[x] = 0;}else if(x == n){c += cost[i][r[x - 1]] + cost[i][r[1]];m = (c > m) ? m : c;c -= cost[i][r[x - 1]] + cost[i][r[1]];}else{c += cost[i][r[x - 1]];if(c <= m){city[i] = 1, r[x] = i;dg(x + 1, c);city[i] = 0; r[x] = 0;}c -= cost[i][r[x - 1]];}}return;
}

后面还是超时

不知道为什么,思路和我同学都一样

代码如下:

#include<iostream>
using namespace std;
int n;
int a[15][15];
int b[15]{};
int i, j, k;
int c = 0;
int cost(int c1,int i) {if(c1>=c){return 0;}int j;int flag = 0;for (j = 0; j < n; j++) {if (b[j] == 0) {flag = 1;b[j] = 1;cost(c1 + a[i][j], j);b[j] = 0;}}if (flag == 0) {c1 += a[i][0];if (c1 < c) {c = c1;}}return 0;
}
int main() {cin >> n;for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {cin >> a[i][j];}}for (i = 0; i < n; i++) {if (i < n - 1) {c += a[i][i + 1];}else {c += a[i][0];}}b[0]=1;cost(0,0);cout << c << endl;return 0;
}

(引自北京大学2023级最强新生)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/217679.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图神经网络入门基础

什么是图 要想解释图的概念&#xff0c;就要从著名的七桥问题开始&#xff1a;一个人如何不重复&#xff0c;不遗漏地走完七座桥&#xff0c;并最终回到起点。大数学家欧拉在回答七桥问题时&#xff0c;开创了图论。 由上图可见&#xff0c;图&#xff08;Graph&#xff09;是…

3.读取字符串【2023.11.25】

1.问题描述 请使用 input 函数读取一串字符串&#xff0c;然后将其输出。 2.解决思路 输入一行字符串。 将读入的变量输出。 3.代码实现 strinput("请输入一个字符串") print(str)4.运行结果

计数问题+约瑟夫问题(map)

目录 一、计数问题 二、约瑟夫问题 一、计数问题 #include<iostream> #include<map> using namespace std; int main() {int n,x;cin>>n>>x;map<int,int>m;for(int i1;i<n;i){if(i>1 && i<10){m[i];}else{int temp i;while (…

Spring Security 6.1.x 系列(5)—— Servlet 认证体系结构介绍

一、前言 本章主要学习Spring Security中基于Servlet 的认证体系结构&#xff0c;为后续认证执行流程源码分析打好基础。 二、身份认证机制 Spring Security提供个多种认证方式登录系统&#xff0c;包括&#xff1a; Username and Password&#xff1a;使用用户名/密码 方式…

openpnp - 丝杠安装调整的总结

文章目录 openpnp - 丝杠安装调整的总结概述笔记发现的问题 - X轴有回差发现的问题 - 丝杠两边的轴承座中心有高差(不同轴)备注END openpnp - 丝杠安装调整的总结 概述 设备定制回来后, 丝杠没敢动(开始是小白, 也没发现丝杠的相关问题. 因为看到同学自己安装丝杠那么痛苦, 最…

【Docker】Docker 仓库管理和Docker Dockerfile

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

实验题【网关设置+VRRP+静态路由+OSPF】(H3C模拟器)

嘿&#xff0c;这里是目录&#xff01; ⭐ H3C模拟器资源链接1. 实验示意图2. 要求和考核目标3. 当前配置3.1 PC1、PC2、PC3、PC4和PC5配置3.2 SW配置3.2.1 SW2配置3.2.2 SW3配置3.2.3 SW4配置3.2.4 SW1配置 3.2. R配置3.2.1 R1配置3.2.2 R2配置 ⭐ H3C模拟器资源链接 H3C网络…

YOLOv8改进 | 2023 | MPDIoU、InnerMPDIoU助力细节涨点

论文地址&#xff1a;官方论文地址点击即可跳转 代码地址&#xff1a;官方并没有开源的该损失的函数的代码&#xff0c;我根据文章内容进行了复现代码块在第三章 一、本文介绍 本文为读者详细介绍了YOLOv8模型的最新改进&#xff0c;带来的改进机制是最新的损失函数MPDIoU和融…

二十一、数组(6)

本章概要 数组排序Arrays.sort的使用并行排序binarySearch二分查找parallelPrefix并行前缀 数组排序 根据对象的实际类型执行比较排序。一种方法是为不同的类型编写对应的排序方法&#xff0c;但是这样的代码不能复用。 编程设计的一个主要目标是“将易变的元素与稳定的元素…

Maven项目下详细的SSM整合流程

文章目录 &#x1f389;SSM整合流程一、两个容器整合✨ 1、先准备好数据库config.properties连接、mybatis-config.xml&#x1f38a; 2、容器一&#xff1a;优先配置spring.xml文件&#x1f38a; 3、容器二&#xff1a;配置springMVC.xml文件&#x1f38a; 4、Tomcat整合spring…

张弛语言课,战争电影配音声音细致声音来复原战场

为战争片进行声音配音是一项挑战性的工作&#xff0c;它要求精确再现战场的紧张感和复杂情绪。配音人员和声音设计团队必须创造出真实的战争声景&#xff0c;从战斗的轰鸣声到士兵的呐喊&#xff0c;这些声音元素都需细致打造&#xff0c;以传递战争的惨烈、英勇和人性的复杂。…