递归剪枝题

news2024/9/24 3:25:42

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

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

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

就是先把城市按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.coloradmin.cn/o/1248602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【模拟开关CH440R】2022-1-20

资料模拟开关CH440芯片手册 - 百度文库 ch440R回来了&#xff0c;导通usb设备没问题&#xff0c;降压不影响。但是我发现个严重的问题&#xff0c;我的电路是直接通过4067控制ch440r接地&#xff0c;低电平&#xff0c;使能三个线路连一起的&#xff0c;邮箱的图您看看&#xf…

核药供应链创新:远大医药策略与明道云实践

摘要 文章首先介绍了远大医药是一家集药品制剂、医疗器械、抗肿瘤以及原料药、生物健康等业务于一体的综合型科技企业&#xff0c;在全球拥有 30 多家成员企业。接着提到核药供应链数字化场景的特点&#xff0c;包括管理严格、物流过程复杂等。 然后指出在核药业务数字化建设中…

C#,《小白学程序》第一课:初识程序,变量,数据与显示

曰&#xff1a;扫地僧练就绝世武功的目的是为了扫地更干净。 1 引言 编程只是一项技术&#xff0c;如包包子&#xff0c;不是什么高深的科学。 学习程序最不好的方法是先学习枯燥的语法。 学习程序主要是用代码解决问题。因此&#xff0c;我们抛开所有的语法与诸多废物&…

番外篇之矩阵运算

矩阵的运算代码&#xff08;加减乘除&#xff09;&#xff08;内有注释&#xff09; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define ROW 10 //定义行 #define COL 10 //定义列 //设置全局变量A矩阵的m代表实际矩阵的行数&#xff0c;n代表实际矩阵的列…

OSG粒子系统与阴影-雾效模拟(1)

虚拟现实中有很多效果&#xff0c;如雨效、雪效、雾效等&#xff0c;这些都可以通过粒子系统来实现。一个真实的粒子系统的模式能使三维场景达到更好的效果。 本章对OSG粒子系统的使用以及生成自定义粒子系统的方法进行了详细介绍最后还附带说明了阴影的使用方法。在实时的场景…

HTML新特性【缩放图像、图像切片、平移、旋转、缩放、变形、裁切路径、时钟、运动的小球】(二)-全面详解(学习总结---从入门到深化)

目录 绘制图像_缩放图像 绘制图像_图像切片 Canvas状态的保存和恢复 图形变形_平移 图形变形_旋转 图形变形_缩放 图形变形_变形 裁切路径 动画_时钟 动画_运动的小球 引入外部SVG 绘制图像_缩放图像 ctx.drawImage(img, x, y, width, height) img &#xf…

R语言——图解taxize,强烈推荐收藏关注,持续更新中

图解taxize 1. taxize分解思路1.1 图解说明 2. 针对不同数据库的函数组2.1 APGⅢ2.2 BOLD&#xff08;barcode of life data system&#xff09; 1. taxize分解思路 taxize可以帮助人们从许多数据库中获取信息。 由于要处理的数据库很多&#xff0c;导致taxize包含的功能函数…

一文教你开启真人3D手办生意

真人手办定制是现代数字化技术结合文化创意视角而诞生的一种新型消费场景。在3D技术的辐射之下&#xff0c;真人3D手办生产与销售的是产销合一的数字化产品&#xff0c;想要实现这种精准消费的高效化、规模化&#xff0c;既需要专业技术也需要在线平台&#xff0c;一旦通路达成…

Ubuntu18.4中安装wkhtmltopdf + Odoo16配置【二】

deepin Linux 安装wkhtmltopdf 1、先从官网的链接里下载linux对应的包 wkhtmltopdf/wkhtmltopdf 下载需要的版本&#xff0c;推荐版本&#xff0c;新测有效&#xff1a; wkhtmltox-0.12.4_linux-generic-amd64.tar.xz 2、解压下载的文件 解压后会有一个wkhtmltox文件夹 3…

linux高级篇基础理论六(firewalld,防火墙类型,,区域,服务端口,富语言)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

『亚马逊云科技产品测评』活动征文|低成本搭建物联网服务器thingsboard

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 0. 环境 - ubuntu22&#xff08;注意4G内存勉强够&#xff0c;部署完…

【Linux】进程间通信——进程间通信的介绍和分类、管道、匿名管道、命名管道、匿名管道与命名管道的区别

文章目录 进程间通信1.进程间通信的介绍1.1目的和发展 2.进程间通信分类3.管道3.1匿名管道3.1.1匿名管道的原理&#xff08;文件角度&#xff09;3.1.2匿名管道的原理&#xff08;内核角度&#xff09;3.1.3管道读写规则3.1.4管道特点 3.2命名管道3.2.1创建命名管道3.2.2命名管…

Twincat使用:EtherCAT通信扫描硬件设备链接PLC变量

EtherCAT通信采用主从架构&#xff0c;其中一个主站设备负责整个EtherCAT网络的管理和控制&#xff0c;而从站设备则负责在数据环网上传递数据。 主站设备可以是计算机、工控机、PLC等&#xff0c; 而从站设备可以是传感器、执行器、驱动器等。 EL3102:MDP5001_300_CF8D1684;…

【文末送书】机器学习高级实践

2023年初是人工智能爆发的里程碑式的重要阶段&#xff0c;以OpenAI研发的GPT为代表的大模型大行其道&#xff0c;NLP领域的ChatGPT模型火爆一时&#xff0c;引发了全民热议。而最新更新的GPT-4更是实现了大型多模态模型的飞跃式提升&#xff0c;它能够同时接受图像和文本的输入…

OpenStack云计算平台-镜像服务

目录 一、镜像服务概览 二、安装和配置 1、先决条件 2、安全并配置组件 3、完成安装 三、验证操作 一、镜像服务概览 OpenStack镜像服务是IaaS的核心服务&#xff0c;如同 :ref:get_started_conceptual_architecture所示。它接受磁盘镜像或服务器镜像API请求&#xff0c;…

浏览器缓存控制讲解

缓存的作用 在你访问互联网中的任何资源其所产生的任何链路中的每一个节点几乎都会进行缓存&#xff0c;整个缓存体系和细节十分复杂。比如浏览器缓存&#xff0c;服务器缓存&#xff0c;代理服务器缓存&#xff0c;CDN缓存等。 但是缓存又十分重要&#xff0c;不可缺少&…

matlab三维地形图

matlab三维地形图 %%%%—————Code to draw 3D bathymetry—————————— %-------Created by bobo,10/10/2021-------------------- clear;clc;close all; ncdisp E:\data\etopo\scs_etopo.nc filenmE:\data\etopo\scs_etopo.nc; londouble(ncread(filenm,lon)); lat…

P8 C++引用

前言 本期我们要讲的是 C 中的引用。 上期我们讨论了指针&#xff0c;如果你没有看过那期内容&#xff0c;你一定要回去看看&#xff0c;因为引用实际上只是指针的扩展&#xff0c;你至少需要在基本层面上理解指针是如何工作的&#xff0c;然后才能继续学习本期的内容&#xf…

第一百七十八回 介绍一个三方包组件:SlideSwitch

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何创建垂直方向的Switch"相关的内容&#xff0c;本章回中将 介绍SlideSwitch组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们…

哈希表的认识与实现

哈希的概念 可以不经过任何比较&#xff0c;一次直接从表中得到要搜索的元素。如果构造一种存储结构&#xff0c;通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系&#xff0c;那么在查找时通过该函数可以很快找到该元素。 所以当我们设置这种…