题目链接

题意:给出一个式子,但这个式子不一定是等式,在‘+’,‘-’,‘=’符号位置不变的情况下,又一次排列数字的位置,使其成为等式。假设能够的话。输出当中一种排列方式。

思路:我们将等号右边的数所有移动到等号右边,比如a+b-c=d-e,移动后变成a+b+e-(c+d)=0。也就是a+b+e=c+d。所以当式子能够变化成等式时,所有数的和必定是偶数。那么问题能够转化为在n个数中找出m个数(m的值为等号左边的整数的数量),使m个 数的和为从和的一半。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int MAXN = 1005;char str[MAXN], Lsy[MAXN], Rsy[MAXN], vis[MAXN];
int arr[MAXN], front[MAXN], back[MAXN];
int cnt1, cnt2, eql, Lnum, ans, flag, L, R;int init() {cnt1 = 1, cnt2 = eql = L = R = 0;int l = strlen(str), sum = 0; sscanf(str, "%d", &arr[0]);sum = arr[0];for (int i = 0; i < l; i++) {if (str[i] == '+' || str[i] == '-' || str[i] == '=') {if (str[i] == '=')eql = i;if (!eql) {Lsy[L] = str[i];L++;}else if (eql != i) {Rsy[R] = str[i];R++;}sscanf(str + i + 1, "%d", &arr[cnt1]);sum += arr[cnt1++];} }Lnum = 1;for (int i = 0; i < l; i++) {if (i < eql && str[i] == '+') Lnum++;else if (i > eql && str[i] == '-')Lnum++; }return sum;
}int dfs(int k, int pos, int cur) {if (k == Lnum) {if (cur == ans)  return true;return false;}if (Lnum - k > cnt1 - pos)return false;if (pos < cnt1 && cur + arr[pos] <= ans) {vis[pos] = 1; if (dfs(k + 1, pos + 1, cur + arr[pos])) return true;vis[pos] = 0;}if (pos < cnt1 && dfs(k, pos + 1, cur)) return true;return false;
}void outPut() {int x = 0, y = 0;for (int i = 0; i < cnt1; i++) {if (vis[i]) front[x++] = arr[i];elseback[y++] = arr[i]; }printf("%d", front[--x]);for (int i = 0; i < L; i++) {printf(" %c ", Lsy[i]); if (Lsy[i] == '+')printf("%d", front[--x]);if (Lsy[i] == '-')printf("%d", back[--y]); }printf(" = ");printf("%d", back[--y]); for (int i = 0; i < R; i++) {printf(" %c ", Rsy[i]); if (Rsy[i] == '+')printf("%d", back[--y]);  if (Rsy[i] == '-')printf("%d", front[--x]);}printf("\n");
}int main() {while (gets(str)) {int s = init(); if (s % 2)printf("no solution\n");else {ans = s / 2;memset(vis, 0, sizeof(vis));if (dfs(0, 0, 0))outPut();  else printf("no solution\n");}}    return 0;
}

转载于:https://www.cnblogs.com/lytwajue/p/7210876.html

UVA10317- Equating Equations(回溯+剪枝)相关推荐

  1. 回溯 剪枝 之跳马问题

    回溯 剪枝 之跳马问题 原创声明 // // Created by Chenglong Shi on 2021/11/19. // Only can use to study // Once foun ...

  2. [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

    [问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...

  3. LeetCode 1681. 最小不兼容性(回溯+剪枝)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums​​​ 和一个整数 k .你需要将这个数组划分到 k 个相同大小的子集中,使得同一个子集里面没有两个相同的元素. 一个子集的 不 ...

  4. LeetCode 996. 正方形数组的数目(回溯+剪枝)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组. 返回 A 的正方形排列的数目.两个排列 A1 和 A2 ...

  5. LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)

    文章目录 1. 题目 2. 解题 1. 题目 我们有 n 栋楼,编号从 0 到 n - 1 .每栋楼有若干员工.由于现在是换楼的季节,部分员工想要换一栋楼居住. 给你一个数组 requests ,其中 ...

  6. 剑指Offer - 面试题38. 字符串的排列(全排列,排序,回溯+剪枝)

    1. 题目 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" 输出:["ab ...

  7. leetcode(力扣) 39. 组合总和(回溯 剪枝)

    文章目录 题目描述 思路分析 完整代码 剪枝: 完整代码 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为 ...

  8. POJ1416 Shredding Company ACM解题报告(DFS回溯+剪枝)

    本渣渣明天C语言考试,今天有点亢奋,又来了一题,这题感觉比前一题难多了,不仅是字符串转化为数字,即使看了百度提醒的搜索树,还是参考了一些百度的代码.感觉道阻且长,我仍需努力.下面是题目翻译: 公司现在 ...

  9. Leetcode47全排列II(回溯+剪枝)

    给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. /*** @param {number[]} nums* @return {number[][]}*/ var perm ...

  10. hdu 5305 回溯+剪枝

    思路:对每一条边涂上颜色1或-1,颜色值加到关联的两个点上,则一种成功的方案必须满足最后每个点的值为0. 剪枝:统计出和某个点i相关联的边的个数,如果枚举到某一条边的时候发现:abs(sum[i]) ...

最新文章

  1. 在windows下基于visual studio2017和CMake的安装Google glog
  2. 使用 RequireJS 优化 Web 应用前端
  3. Android SQLite数据库增删改查操作
  4. 【car】买车时保险的坑
  5. GDCM:把DICOM文件存在vector<char>里面的测试程序
  6. Python 资料性网站。
  7. 一直在构建版本_构建系统与代码结构SpringBoot
  8. docker(podman)命令参考
  9. PS教程,今天它来了
  10. 根据省份id查询当前的省会/简称/省会城市
  11. 【OpenGL】用GLFW和glad创建窗口
  12. JAVA设计模式之桥接模式
  13. 新建文本文档出现错误怎么办
  14. 服务器里怎么找到K3账套文件,金蝶K3账套自动备份步骤详解
  15. 黑苹果安装 hackintosh Lenovo Y50-70 TransMac 破解版安装
  16. 电脑实时监控信息:CPU 内存 GPU使用率在桌面上动态展现
  17. C++设计模式-中介者模式详解
  18. 细菌(disease)解题报告 - 搜索与回朔
  19. 基于php的网络教学平台,基于PHP技术的网络教学平台的设计与实现
  20. 教你一招:使用最快速的方式激活windows10专业版

热门文章

  1. C++ Make、Makefile、CMake和CMakeLists关系
  2. 阿里云 linux centos nginx安装IP ssl https证书
  3. 简述使jdbc连接mysql数据库_java中简述使用JDBC完成数据库操作的基本步骤。
  4. al32utf8的日期格式_五分钟学会Oracle数据库字符集
  5. 大华平台linux命令,大华平台软件简介.docx
  6. 数据库学习----MySQL(二)
  7. BigDecimal——大十进制-货币型-双精度-精确运算
  8. 十八、Oracle学习笔记:PLSQL操作(含游标的操作)
  9. 7-4 mmh学长与出栈 (20分)
  10. 微服务架构设计的简单理解