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 39. Combination Sum II

和LeetCode 38. Combination Sum

39-Combination Sum

题目:Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all uniqu...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

135.Combination Sum-数字组合(中等题)

数字组合 题目给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T。C中的数字可以无限制重复被选取。 例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为: [...

Leetcode|Combination Sum III[回溯]

Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

LeetCode_40---Combination Sum II

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

DFS-leetcode Combination Sum I/I I

深度优先搜索(DFS)是搜索算法的一种。最早接触DFS应该是在二叉树的遍历里面,二叉树的先序、中序和后序遍历实际上都属于深度优先遍历,实质就是深度优先搜索,后来在图的深度优先遍历中则看到了更纯正的深度...

Combination Sum

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

leetcode【39+40+216+377 Combination Sum 相关】【python】

39Combination Sum是说让我们在给定数组C中找到所有的组合,使得组合中数字的和是target值。并且组合里的数字可以重复,也就是不限制C中每一个数字的使用。 这明显是回溯啦,大家记得让...

LeetCode39 Combination Sum

原题:英:Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all uni...

【LeetCode】 Combination Sum 系列

Combination Sum 【LeetCode】39.Combination Sum 【LeetCode】40.Combination Sum2
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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