zoukankan      html  css  js  c++  java
  • 39. 组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

    candidates 中的数字可以无限制重复被选取。

    说明:

    所有数字(包括 target)都是正整数。
    解集不能包含重复的组合。 
    示例 1:

    输入:candidates = [2,3,6,7], target = 7,
    所求解集为:
    [
    [7],
    [2,2,3]
    ]
    示例 2:

    输入:candidates = [2,3,5], target = 8,
    所求解集为:
    [
      [2,2,2,2],
      [2,3,3],
      [3,5]
    ]
     

    提示:

    1 <= candidates.length <= 30
    1 <= candidates[i] <= 200
    candidate 中的每个元素都是独一无二的。
    1 <= target <= 500

    #include<iostream>
    #include<stack>
    #include<algorithm>
    #include<string>
    #include<vector>
    using namespace std;
    /*
    要求返回所有符合要求解的题都是尝试利用到递归,
    1.边界条件
    明确递归终止的条件
    2.递归前进段
    提取重复的逻辑,缩小问题的规模
    3.递归返回段
    给出递归终止时的处理办法
    */
    class Solution {
    public:
    	vector<vector<int>> combinationSum(vector<int>& candidates, int target) 
    	{
    		vector<vector<int>> res;//res 保存所有已经得到的解
    		vector<int> out;//为一个解
    		combinationSumDFS(candidates, target, 0, out, res);
    		return res;
    	}
    	//start 记录当前的递归到的下标
    	//执行递归函数将反复调用其自身,每调用一次就进入新的一层。
    	void combinationSumDFS(vector<int>& candidates, int target, int start, vector<int>& out, vector<vector<int>>& res) 
    	{
    		if (target < 0)
    		{
    			return;
    		}
    		if (target == 0) 
    		{ 
    			res.push_back(out); 
    			return;
    		}
    		for (int i = start; i < candidates.size(); ++i) 
    		{
    			out.push_back(candidates[i]);
    			combinationSumDFS(candidates, target - candidates[i], i, out, res);//调用新的递归函数时,此时的 target 要减去当前数组的的数
    			out.pop_back();
    		}
    	}
    };
    
    int main()
    {
    	int a[1000];
    	int x;
    	int i = 0;
    	vector<int> vec;
    	int target;
    	while (cin >> a[i])
    	{
    
    		vec.push_back(a[i]);
    		i++;//注意这里i++对输出结果的影响
    		x = cin.get();
    		if (x == '
    ')
    			break;
    
    	}
    	cin >> target;
    	vector<vector<int>> ans = Solution().combinationSum(vec, target);
    	int n = ans.size();
    	//输出
    	for (int i = 0; i < n; i++)
    	{
    		for (int j = 0; j < ans[i].size(); j++)
    		{
    			cout << ans[i][j] << " ";
    		}
    		cout << endl;
    	}
    
    	system("pause");
    	return 0;
    }
    

      

  • 相关阅读:
    jvm 虚拟机参数_新生代内存分配
    jvm 虚拟机参数_堆内存分配
    Xshell 安装 Xftp
    使用 Xshell 连接 linux 系统
    linux 常用命令
    java JSON 和 Object 相互转换
    vsftp实现只能上传不能下载、删除权限配置
    从返回的HTTP Header信息中隐藏Apache的版本号及PHP的X-Powered-By信息
    在SecureCRT中无需输入密码登录Linux主机
    ssh 设置私钥实现两台linux主机无密码访问
  • 原文地址:https://www.cnblogs.com/277223178dudu/p/14876664.html
Copyright © 2011-2022 走看看