Considerăm un număr întreg N şi un şir de M cifre zecimale nenule. Să se determine dacă numărul N poate fi rezultatul unei expresii aritmetice simple (fără paranteze), formată exclusiv din cifrele şirului citit şi din operatorii aritmetici desemnaţi pentru operaţiile de adunare şi scădere (+, -).
Cerinţă
Scrieţi un program care citeşte numerele N şi M de pe prima linie a fişierului de intrare şi şirul de M cifre de pe linia următoare şi determină şi afişează expresia găsită sau valoarea 0 în cazul în care nu există soluţie.
Date de intrare
Fișierul de intrare adunscad.in conține pe prima linie numerele întregi N M, separate printr-un spaţiu, reprezentând valoarea ce trebuie obţinută la evaluarea expresiei şi numărul de cifre din şir. Linia a doua a fişierului de intrare conţine şirul celor M cifre nenule, separate prin câte un spaţiu.
Date de ieșire
Fișierul de ieșire adunscad.out va conține pe prima linie expresia determinată, în cazul în care există soluţie, sau valoarea 0 în cazul în care nu există soluţie.
Restricții și precizări
-180 ≤ N ≤ 1802 ≤ M ≤ 20- în şirul citit cifrele se pot repeta
- toate cifrele din şir trebuie să apară şi în expresia aritmetică, în aceeaşi ordine în care au fost citite
- în expresia aritmetică, orice cifră trebuie să fie precedată de un operator; în cazul în care prima cifră este precedată de operatorul
'+'acesta nu se pune în expresie - în expresia aritmetică nu există spaţii
- expresia aritmetică se termină cu caracterul sfârşit de linie
- în cazul în care soluţia nu este unică se va afişa o soluţie corectă
Exemplu 1
adunscad.in
21 43 9 1 8
adunscad.out
3+9+1+8
Exemplu 2
adunscad.in
-1 41 2 3 5
adunscad.out
-1+2+3-5
Exemplu 3
adunscad.in
-7 71 1 1 1 1 1 1
adunscad.out
-1-1-1-1-1-1-1
Exemplu 4
adunscad.in
12 31 2 3
adunscad.out
0
#include <bits/stdc++.h>
using namespace std;
ifstream cin("adunscad.in");
ofstream cout("adunscad.out");
int n , x[25] , a[20] , nr , ok;
void afisare()
{
if(ok == 0)
{
for(int i = 1 ; i <= n ; i++)
{
if(i == 1 && x[i] == 1) cout << a[i];
else if(x[i] == -1) cout << "-" << a[i];
else cout << "+" << a[i];
}
cout << '\n';
ok++;
}
}
void back(int k , int sp)
{
for(int i = -1; i <= 1; i += 2)
{
x[k] = i;
sp = sp + i * a[k];
if(k == n)
{
if(sp == nr) afisare();
}
else back(k + 1 , sp);
sp = sp - i * a[k];
}
}
int main()
{
cin >> nr >> n;
for(int i = 1 ; i <= n ; i++)
cin >> a[i];
back(1 , 0);
if(ok == 0) cout << 0;
}