Yes, it's a brute force solution and it get accepted with run time 616ms.
It won't generate duplicates since if(move == minMove && find(res.begin(), res.end(), s) == res.end()) res.push_back(s);
I have updated if(pos > s.size()) return; to if(pos > s.size() || move > minMove) return;, now it's much faster with run time 196ms.
I came across the same issue. The reason is that we do not need to add individual item as one of the specials.
This is because we could make the assumption that if we need to use the special offers, we always use them 'at the end'.
I got the idea from this solution: https://discuss.leetcode.com/topic/95237/java-dfs-dp