递归剪枝题

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

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

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

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

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

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

代码如下:

#include<stdio.h>
int cost[16][16];
int r[16];//route

int 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;
    }
    //先计算总价钱m
    for(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++;
                }
                else
                    r[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]);

    //先计算总价钱m
    for(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.mfbz.cn/a/188632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

02 _ 架构分层:我们为什么一定要这么做?

在系统从0到1的阶段&#xff0c;为了让系统快速上线&#xff0c;我们通常是不考虑分层的。但是随着业务越来越复杂&#xff0c;大量的代码纠缠在一起&#xff0c;会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动一处就牵一发而动全身等问题。 这时&#xff0c;对系统进…

基于OGG实现Oracle实时同步MySQL

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Python---函数定义时缺省参数(参数默认值)---放最右边

缺省参数也叫默认参数&#xff0c;用于定义函数&#xff0c;为参数提供默认值&#xff0c;调用函数时 可 不传该默认参数的值&#xff08;注意&#xff1a;所有位置参数必须出现在默认参数前&#xff0c;包括函数定义和调用&#xff09;。 比如&#xff1a;原先的代码&#…

[修订版][工控]SIEMENS S7-200 控制交通红绿灯程序编写与分析

下载地址>https://github.com/MartinxMax/Siemens_S7-200_Traffic_Light 特别鸣谢接线过程实验目的题目要求I/O分配公式公式套用示例 程序分析分割块[不是必要的,自己分析用]左侧梯形图 [B1-B5]B1 [东西绿灯亮25s]B2 B3 B23 [东西绿灯闪烁3s]B4 [东西黄灯亮2s]B5 [东西红灯…

Kafka配置SASL认证密码登录

​​​​​​1、修改config/server.properties&#xff0c;添加如下内容 listenersSASL_PLAINTEXT://内网ip:9092 advertised.listenersSASL_PLAINTEXT://外网ip:9092 security.inter.broker.protocolSASL_PLAINTEXT sasl.mechanism.inter.broker.protocolPLAIN sasl.enabled.…

SQL 中的运算符与别名:使用示例和语法详解

SQL中的IN运算符 IN运算符允许您在WHERE子句中指定多个值&#xff0c;它是多个OR条件的简写。 示例&#xff1a;获取您自己的SQL Server 返回所有来自’Germany’、France’或’UK’的客户&#xff1a; SELECT * FROM Customers WHERE Country IN (Germany, France, UK);语…

Linux基本指令及周边(第二弹)

文章目录 前言echo命令重定向more命令less指令&#xff08;重要&#xff09;head指令tail指令时间相关的指令Cal指令find指令&#xff1a;&#xff08;非常重要&#xff09; -namegrep指令.zip/unzip指令&#xff1a;tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包…

感恩有你|恭喜 OpenTiny Vue 开源组件库喜迎1000+star!!!

OpenTiny社区的 TinyVue 组件库终于突破1000star~ 感谢所有支持 OpenTiny 开源社区的朋友们&#xff01; 对此&#xff0c;参与 OpenTiny 开源的各位项目成员也是十分激动和开心&#xff0c;因此也是在内部进行了一个小小的庆祝。同时大家也希望持续不断的将项目做的越来越好&a…

原生javascript实现放大镜效果

效果图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>放大镜</title><style&g…

Robots 元标签与 X-Robots 标签

Robots Meta Tag 和 X-Robots-Tag 是两个常用的 HTML 标签&#xff0c;它们对观察机动爬虫和其他网络机器人很有启发性。这些标签可以控制您的网页如何被记录和显示。 什么是机器人元标记&#xff1f; 机器人元标记是一个 HTML 标签&#xff0c;它提供信息来查看电机爬虫和其…

【Python篇】详细讲解正则表达式

文章目录 &#x1f339;什么是正则表达式&#x1f354;语法字符类别重复次数组合模式 ✨例子 &#x1f339;什么是正则表达式 正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;简称为正则或正则表达式&#xff0c;是一种用于匹配、查找和操作文本字符串的工…

LemMinX-Maven:帮助在eclipse中更方便地编辑maven的pom文件

LemMinX-Maven&#xff1a;https://github.com/eclipse/lemminx-maven LemMinX-Maven可以帮助我们在eclipse中更方便地编辑maven工程的pom.xml文件&#xff0c;例如补全、提示等。不用单独安装&#xff0c;因为在安装maven eclipse插件的时候已经自动安装了&#xff1a; 例…

鸿蒙开发板——环境搭建(南派开发)

概述 为了帮大家理清楚鸿蒙开发的套路&#xff0c;我们从头再梳理一遍相关的脉络。并为大家总结一些重点性的内容。在介绍OpenHarmony特性前&#xff0c;需要大家先明确以下两个基本概念&#xff1a; 子系统 OpenHarmony整体遵从分层设计&#xff0c;从下向上依次为&#xf…

移动家庭云电脑只能24小时不关机

DD转换Linux也不行&#xff0c;北京地区套餐为家庭云电脑畅享版月包&#xff0c;客服回复目前只能设置24小时不关机。 24小时必须关机这是很严重的问题&#xff0c;不能随时保持在线连接&#xff0c;也没有公网IP。

如何在Linux系统安装Nginx并启动

Nginx的介绍 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。官网&#xff1a;nginx newsNginx的下载 前往…

深度学习+不良身体姿势检测+警报系统+代码+部署(姿态识别矫正系统)

正确的身体姿势是一个人整体健康的关键。然而&#xff0c;保持正确的身体姿势可能很困难&#xff0c;因为我们经常忘记这一点。这篇博文将引导您完成为此构建解决方案所需的步骤。最近&#xff0c;我们在使用 POSE 进行身体姿势检测方面玩得很开心。它就像一个魅力&#xff01;…

uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解

文章目录 前言一、自定义条件编译平台是什么&#xff1f;二、新增自定义条件编译平台三、动态设置服务器请求地址四、动态修改manifest.json1.根目录新增文件 modifyManifest.js2.vue.config.js引入modifyManifest.js 总结示例代码 前言 企业项目开发流程上一般都要配置多个运…

【Linux】 sudo命令使用

sudo sudo是linux系统管理指令&#xff0c;是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具&#xff0c;如halt&#xff0c;reboot&#xff0c;su等等。这样不仅减少了root用户的登录 和管理时间&#xff0c;同样也提高了安全性。sudo不是对shell的一个代替…

ubuntu修改系统语言

修改ubuntu系统语言 操作指令修改系统设置总结 操作 ubuntu系统自带的英文环境&#xff0c;个人觉得用起来不方便。改掉吧。换成中文 指令修改 参考了一些博客的解决方式 ctrlartT 打开终端。 sudo apt-get install language-pack-zh-hans 输入下载汉化包的指令。 但是&…

Spring 拾枝杂谈—Spring原生容器结构剖析(通俗易懂)

目录 一、前言 二、Spring快速入门 1.简介 : 2. 入门实例 : 三、Spring容器结构分析 1.bean配置信息的存储 : 2.bean对象的存储 : 3.bean-id的快捷访问 : 四、总结 一、前言 开门见山&#xff0c;11.25日开始我们正式进入Java框架—Spring的学习&#xff0c;此前&…