回溯法解决工作分派问题

2024-01-02 00:12

本文主要是介绍回溯法解决工作分派问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 解决这个问题的关键有两个:

1.t数组用来在回溯过程暂时存储工作分配关系

2.ans数组用来保存最终答案

3."恢复现场"操作

4.一维数组st,表示该工作是否已经被选

5.solve第k层递归表示第k个人,for循环罗列的是工作.这样,比k表示工作,for循环枚举人更加符合我们的直觉和生活常识

#include<iostream>
#include<limits.h>
using namespace std;
const int N=100;
int C[N][N];
int t[N][N];//t数组和ans数组是关系矩阵,若其值为1,表示第k个人选择第i份工作 
int ans[N][N];//t数组用来在回溯过程进行暂时存储,ans用来保存答案 
bool st[N];//st数组只需一维,一一对应工作 
int n,m;
int MIN=INT_MAX;
int cost; 
/*
5
1 2 3 4 5
5 4 3 2 1
12 11 13 14 15
10 9 6 8 7
9 6 15 5 8
*/
/*
5
1 2 3 4 5
5 4 3 2 1
15 14 13 12 11
10 9 6 8 7
9 6 15 5 8
*/
void solve(int k)//k代表人,是C数组中的行 
{for(int i=1;i<=n;i++)//i代表工作 ,是C数组中的列 {if(!st[i]){cost+=C[k][i];t[k][i]=1;st[i]=true;if(k!=n){solve(k+1);cost-=C[k][i];t[k][i]=0;st[i]=false;}else if(k==n){if(cost<MIN){MIN=cost;for(int p=1;p<=n;p++)for(int q=1;q<=n;q++)ans[p][q]=t[p][q];//					printf("最小成本总和为:%d\n",MIN);
//					printf("各个人的工作及其成本为:\n");
//					for(int p=1;p<=n;p++)
//						for(int q=1;q<=n;q++)
//							if(t[p][q]!=0)
//								printf("第%d个人找到了第%d份工作,成本为:%d\n",p,q,C[p][q]);}cost-=C[k][i];t[k][i]=0;st[i]=false;}}}
}
int main()
{cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&C[i][j]);solve(1);printf("最小成本总和为:%d\n",MIN);printf("各个人的工作及其成本为:\n");for(int p=1;p<=n;p++)for(int q=1;q<=n;q++)if(ans[p][q]!=0)printf("第%d个人找到了第%d份工作,成本为:%d\n",p,q,C[p][q]);return 0;
}

输入:

5
1 2 3 4 5
5 4 3 2 1
15 14 13 12 11
10 9 6 8 7
9 6 15 5 8

输出:

 

这篇关于回溯法解决工作分派问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560866

相关文章

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2