You have received excellent answers already about more efficient approaches, so I'm going to mention a few things which crossed my mind from reading your question and code.

First of all, you say:

> Also any comments about the code are welcome. I don't like it much, since it looks more like functional programming than object oriented, but I don't know how to improve in this direction.

To me, this does not look [functional](http://en.wikipedia.org/wiki/Functional_programming) at all. All your methods return `void`. You're storing mutable state in your `res` variable. This is not functional, this is [*procedural*](http://en.wikipedia.org/wiki/Procedural_programming).

---

Now, about your code. Read this line for me:

 helper(arr, n, tmp, curr, 0);

And then answer my questions: Do what with the arr-what, the n-what, tmp-what and curr-what?

Your naming could be improved a lot here. `helper` can be a helper for anything. Santa's helper? `arr` would be better named as `allAvailableNumbers` or simply `allNumbers`.

`tmp` is temporary for what exactly?

Making code that documents itself is done primarily by naming methods and variables. Naming things 100% correct are hard, but I believe you can do much better than this. Think more about what your variables are used for than what they are (`arr` is an array, yeah... but what is the meaning of it?). There's a thing called Hungarian notation where you *prefix* the name `arr` (or simply `a`) to all your array variables. When you've named it `arr` it's even worse than Hungarian notation as it *only* contains the prefix. It's *Scottish* notation. (There's a stereotype that Scottish are cheap, no offense to the Scots.)

---

On another note, you got two useless variables here:

 int tmp = 0;
 int currPostion;
 helper(arr, n, tmp, curr, 0);

just make that:

 helper(arr, n, 0, curr, 0);

(But please rename the `helper` method!)