题目链接

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

思路:我们将等号右边的数所有移动到等号右边,比如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];
else
back[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;
}

UVA10317- Equating Equations(回溯+剪枝)的更多相关文章

  1. HDU 5113 Black And White 回溯+剪枝

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...

  2. UVA 10317 - Equating Equations (背包)

    Problem F Equating Equations Input: standard input Output: standard output Time Limit: 6 seconds Mem ...

  3. HDU 2553 N皇后问题(回溯 + 剪枝)

    本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...

  4. HDU1010 Tempter of the Bone(回溯 + 剪枝)

    本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398734 题意: 输入一个 N * M的迷宫,这个迷宫里'S'代表小狗的位置,'X'代表陷阱,‘D ...

  5. HDU1016 Prime Ring Problem (回溯 + 剪枝)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398684.html 题意: 给你一个数字N(N <= 20),要求你把这N个数组成一个环,环内的数字不能重复,左右 ...

  6. 回溯剪枝,dfs,bfs

    dfs: 给定一个整数n,将数字1~n排成一排,将会有很多种排列方法. 现在,请你按照字典序将所有的排列方法输出. 输入格式 共一行,包含一个整数n. 输出格式 按字典序输出所有排列方案,每个方案占一 ...

  7. [算法专题] 深度优先搜索&回溯剪枝

    1. Palindrome Partitioning https://leetcode.com/problems/palindrome-partitioning/ Given a string s, ...

  8. TZOJ 1221 Tempter of the Bone(回溯+剪枝)

    描述 The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked i ...

  9. Leetcode题目39.组合总和(回溯+剪枝-中等)

    题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...

随机推荐

  1. 九度oj 题目1455:珍惜现在,感恩生活

    题目描述: 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买.请问:你用有限的资金最 ...

  2. How to use MJRefresh

    Installation with CocoaPods:pod 'MJRefresh' Manual import: Drag All files in the MJRefresh folder to ...

  3. 《Spark Python API 官方文档中文版》 之 pyspark.sql (四)

    摘要:在Spark开发中,由于需要用Python实现,发现API与Scala的略有不同,而Python API的中文资料相对很少.每次去查英文版API的说明相对比较慢,还是中文版比较容易get到所需, ...

  4. kb-07-RMQ线段树--07(动态规划)

    RMQ是一类解决区间最值查询的算法的通称:.一共有四类:在代码中有说明: 下面是ST算法,就是动态规划做法: 来看一下ST算法是怎么实现的(以最大值为例): 首先是预处理,用一个DP解决.设a是要求区 ...

  5. HDU——2054A==B?

    A == B ? Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. NOJ——1568走走走走走啊走(超级入门DP)

    [1568] 走走走走走啊走 时间限制: 1000 ms 内存限制: 65535 K 问题描述 菜菜赚了钱回来,想起要买很多桶回来,不同地方的桶质量是不同的,他在(1,1)点出发因为飞机票有点贵所以他 ...

  7. BZOJ-1085 骑士精神

    估价函数其实就是与目标状态有几个不同... 迭代启发搜索. #include <cstdlib> #include <cstdio> #include <cstring& ...

  8. volatile的用法

    在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized ...

  9. poj1324 Holedox Moving

    Holedox Moving Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 16980   Accepted: 4039 D ...

  10. Java面试题之有没有有顺序的Map实现类,如果有,他们是怎么实现有序的?

    Hashmap和Hashtable 都不是有序的. TreeMap和LinkedHashmap都是有序的.(TreeMap默认是key升序,LinkedHashmap默认是数据插入顺序) TreeMa ...