您的位置:首页 > 其它

[LeetCode] Combination Sum

2014-07-13 17:04 525 查看
void  func(const vector<int> & candidates, int target,   vector<int> & path,
  
            int cur , int sum , vector<vector<int> > & ret )
{
if( sum == target ) {
ret.push_back(path);
//  path.pop_back();   //
return;
}
else if( cur >= candidates.size() ) {
//    if(!path.empty()) path.pop_back();
return;
}

for(int i = 0; sum  +  i * candidates[cur]  <= target ; i++)
{
for(int j = 0 ;j < i;j++)
path.push_back(candidates[cur]);

func( candidates, target, path, cur+1, sum + i*candidates[cur] , ret);

for(int j = 0 ; j< i;j++)
path.pop_back();
}

}
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {

vector<vector<int> >  ret ;
vector<int>  path;
sort(candidates.begin() , candidates.end());
func( candidates, target, path, 0, 0 , ret);
return ret;
}


全部背包问题。由于要生成并保存所有可行解,必须使用DFS递归。

代码技巧:函数参数使用引用。(如何保证互不影响??)

扩展问题:如果要求可行解的个数呢?下面给出递归和递推两种方法。

代码技巧:递归的难点在递归的层级和边界,这两个递归的边界处理,各有技巧。

int count(const vector<int> & vec ,int key)
{
int i,j,k;
for(i = 1 ; i < M ; i++) {
B[i][0] = 1 ;
}
for(j=1; j<=N; j++){
B[M-1][j] = ( j % vec[M-1] ? 0 : 1);
}

for ( i = M-2 ; i >= 0 ; i--)
for( j = 1; j<= key ;j++)
{
for( k = 0; k <= j; k += vec[i])
B[i][j] += B[i+1][j-k];
}

return B[0][key];
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: