la idea del backtracking es "llegar hasta el fondo" y si no es correcto, retroceder.
Un ejemplo de aplicación es la solución de un laberinto.
pero voy a poner algo más sencillo, un programa que genera todas las combinaciones de 0 y 1 de longitud n
#include <iostream>
#include <vector>
using namespace std;
typedef vector<bool> VB;
void combinaciones (VB& v, int count) {
if (count == int(v.size())) {
// imprimir el vector
for (int i = 0; i < int(v.size()); ++i) cout << v;
cout << endl;
return;
}
v[count] = true;
combinaciones(v, count+1);
v[count] = false;
combinaciones(v, count+1);
}
int main () {
int n;
cin>>n;
VB v(n);
combinaciones(v, 0);
}