题目链接

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

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

最新文章

  1. Caffe源码解析5:Conv_Layer
  2. Padrino 生成器指南
  3. RDIFramework.NET ━ 9.11 数据字典管理 ━ Web部分
  4. CentOS6.5Minimal安装Gitlab7.5
  5. [转载] Linux下查看内存使用情况方法总结
  6. 给Asp.net MVC Forms 验证设置角色访问控制
  7. NSTimer运行机制和线程问题
  8. 配置Apache服务器 数据库mySQL
  9. 用ArrayList(解决约瑟夫问题)
  10. ssm整合说明与模板-Spring Spring MVC Mybatis整合开发
  11. 由一道bash jail题引出的琐事@_@
  12. 用dedecms做网站时,空间服务器选择IIS还是apache???
  13. git 强制覆盖分支
  14. CentOS 7 rabbitmq 安装
  15. 一:window环境,LaTex快速安装(简单易懂)
  16. 人脸识别准备 -- 基于raspberry pi 3b + movidius
  17. MATLAB数值分析实验
  18. P1186 玛丽卡 删边最短路最大值
  19. SpringBoot 消息转换器 HttpMessageConverter
  20. Shell学习---Shell脚本的静态检查工具shellcheck

热门文章

  1. 顺序表ans链性表
  2. POJ 1145 Tree Summing
  3. Unity3D - UGUI的手动搭建
  4. 简单使用jstl实现敏感字替换
  5. Dropbox面向第三方开发者推出全新的Datastore API
  6. iOS----闪退,无报错原因,经典解决方案
  7. 【bzoj3526】[Poi2014]Card 线段树区间合并
  8. kb-07专题线段树-02--单点修改,区间最值
  9. Java众神之路(1)-语言介绍
  10. Microsoft IIs tilde directory enumeration