Combination Sum

原创 2015年11月19日 15:06:52

题目名称
Combination Sum—LeetCode链接

描述
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:
All numbers (including target) will be positive integers.
Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
The solution set must not contain duplicate combinations.
For example, given candidate set 2,3,6,7 and target 7,
A solution set is:

[7] 
[2, 2, 3] 

分析
  还是用到回溯法,这里允许元素重复,约束函数就是当前可能解的sum等于target就行。

C++代码

/************************************************* 
Copyright: 武汉大学计算机学院B507 
Author: Ryan
Date: 2015-11-19 
Description: Given a set of candidate numbers (C) and a target number (T), 
             find all unique combinations in C where the candidate numbers sums to T.
**************************************************/ 
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//函数申明 
void comb(vector<int> candidates, int index, int sum, int target, vector<vector<int> > &res, vector<int> &path);

vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
    sort(candidates.begin(),candidates.end());
    vector<vector<int> > res;
    vector<int> path;
    comb(candidates,0,0,target,res,path);
    return res;
}
/* 回溯法求所有解,path为一个可行解,res存储所有解向量 
 * 约束函数为sum==target 
 * 允许元素重复 
 */ 
void comb(vector<int> candidates, int index, int sum, int target, vector<vector<int> > &res, vector<int> &path)
    {
        if(sum>target)
            return;
        if(sum==target){
            res.push_back(path);
            return;
        }
        for(int i= index; i<candidates.size();i++)
        {
            path.push_back(candidates[i]);
            comb(candidates,i,sum+candidates[i],target,res,path);
            path.pop_back();
        }
}


//测试用例 
int main() {
    int a[] = {2,3,6,7};
    vector<int> nums(a,a+4);    
    int target = 7;
    vector<vector<int> > res = combinationSum(nums,target);
    cout<<"["<<endl;
    for(int i=0;i<res.size();i++) {
        cout<<" [";
        for(int j=0;j<res[i].size();j++) {
            cout<<" "<<res[i][j];
        }
        cout<<" ]"<<endl;
    }
    cout<<"]"<<endl;
    return 0;
}

总结
  运行结果如下图:

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。如果转载一定要通知博主哦~~

相关文章推荐

leetcode_middle_35_377. Combination Sum IV

题意: 给定一个不重复的正整数数组和一个正整数,找出数组的数相加等于这个正整数的可能组合数。(组合中的数字可以重复,可以不必使用所有数组的数,不同顺序各算一种) 分析: 我们要得出之和的可能数,就是要...
  • pusude
  • pusude
  • 2017年02月10日 15:53
  • 60

LeetCode 39:Combination Sum

每一次向下搜索时,起始位置都和上一次相同,因为可以取相同元素不止一次,即每次向下传入的index For循环每次从index开始,避免返回到之前的元素 DFS搜索 如果sum>target 则r...

leetcode -- Combination Sum II -- 重点

https://leetcode.com/problems/combination-sum-ii/与Combination Sum一样,只是每个元素只能用一次。子节点集合不包括本身就行。还是要排序,排...
  • xyqzki
  • xyqzki
  • 2015年12月14日 14:04
  • 211

Combination Sum I

题: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C...
  • haihaa
  • haihaa
  • 2016年05月07日 13:51
  • 130

LeetCode: Combination Sum

#include #include #include using namespace::std; class Solution { public: vector > combinationS...
  • wyc1230
  • wyc1230
  • 2012年09月30日 11:35
  • 423

DAY19:leetcode #40 Combination Sum II

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in...

LeetCode—*Combination Sum II(DFS算法C数组中有重复值)

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in...

[leetcode] 40. Combination Sum II

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in...

Combination Sum I&II Pernutation I&II

leetcode

leetcode:Combination Sum(I,II)

原题: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Combination Sum
举报原因:
原因补充:

(最多只允许输入30个字)