class Solution
{
private:
vector< vector< int >> result;
vector< int > path;
void backTracking ( vector< int > & candidates, int target, int sum, int startIndex, vector< bool> & used) ;
public:
vector< vector< int >> combinationSum2 ( vector< int > & candidates, int target)
{
path. clear ( ) ;
result. clear ( ) ;
sort ( candidates. begin ( ) , candidates. end ( ) ) ;
vector< bool> used ( candidates. size ( ) ) ;
backTracking ( candidates, target, 0 , 0 , used) ;
return result;
}
} ;
inline void Solution:: backTracking ( vector< int > & candidates, int target, int sum, int startIndex, vector< bool> & used)
{
if ( sum == target)
{
result. push_back ( path) ;
return ;
}
for ( int i = startIndex; i < candidates. size ( ) ; ++ i)
{
if ( i > 0 && candidates[ i] == candidates[ i - 1 ] && used[ i - 1 ] == 0 )
continue ;
if ( sum + candidates[ i] <= target)
{
path. push_back ( candidates[ i] ) ;
sum += candidates[ i] ;
used[ i] = 1 ;
backTracking ( candidates, target, sum, i + 1 , used) ;
sum -= candidates[ i] ;
path. pop_back ( ) ;
used[ i] = 0 ;
}
}
}
class Solution
{
private:
vector< vector< int >> result;
vector< int > path;
void backTracking ( vector< int > & candidates, int target, int sum, int startIndex) ;
public:
vector< vector< int >> combinationSum2 ( vector< int > & candidates, int target)
{
path. clear ( ) ;
result. clear ( ) ;
sort ( candidates. begin ( ) , candidates. end ( ) ) ;
backTracking ( candidates, target, 0 , 0 ) ;
return result;
}
} ;
inline void Solution:: backTracking ( vector< int > & candidates, int target, int sum, int startIndex)
{
if ( sum == target)
{
result. push_back ( path) ;
return ;
}
for ( int i = startIndex; i < candidates. size ( ) ; ++ i)
{
if ( i > startIndex && candidates[ i] == candidates[ i - 1 ] )
continue ;
if ( sum + candidates[ i] <= target)
{
path. push_back ( candidates[ i] ) ;
sum += candidates[ i] ;
backTracking ( candidates, target, sum, i + 1 ) ;
sum -= candidates[ i] ;
path. pop_back ( ) ;
}
}
}