zoukankan      html  css  js  c++  java
  • leetcode子集和问题

    Combination Sum

    回溯法应用

    数组不含重复元素,结果可含重复元素。回溯法。

    自己写的代码:

    class Solution {
    public:
    vector<vector<int>>v;
    vector<int>v1;
    int sum;
        vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
            sort(candidates.begin(),candidates.end());
            v.clear();
            sum=0;
            backtrace(candidates,target,0);
            sort(v.begin(),v.end());
            return v;        
        }
        void backtrace(vector<int> &candidates, int target,int dep)
        {
            if(sum==target)
            {
                if(count(v.begin(),v.end(),v1)==0)v.push_back(v1);
            }
            if(dep==candidates.size())
            return;    
            if(dep<candidates.size())
            {
                int j=(target-sum)/candidates[dep];
                for(int i=0;i<j;i++)/可加入j次
                {      
                    sum+=candidates[dep];
                    v1.push_back(candidates[dep]);  
                    backtrace(candidates,target,dep+1); 
                }
                for(int i=0;i<j;i++)
                {
                    sum-=candidates[dep];
                    v1.pop_back();          
                }
                backtrace(candidates,target,dep+1);//不包含此元素时 
            }
        }
    };
    

     给出的集合里有重复元素,但每一个元素只能用一次

    class Solution {
    public:
    vector<vector<int>>v;
    vector<int>v1;
    int sum;
        vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
            sort(candidates.begin(),candidates.end());
            v.clear();
            sum=0;
            backtrace(candidates,target,0);
            sort(v.begin(),v.end());
            return v;        
        }
        void backtrace(vector<int> &candidates, int target,int dep)
        {  
            if(sum==target)
            {
                if(count(v.begin(),v.end(),v1)==0)v.push_back(v1);
            }
            if(dep==candidates.size())
            return;    
            if(dep<candidates.size()&&sum<target)
            {
                    sum+=candidates[dep];
                    v1.push_back(candidates[dep]);  
                    backtrace(candidates,target,dep+1); 
                    sum-=candidates[dep];
                    v1.pop_back();          
                    backtrace(candidates,target,dep+1);
            }
        }
    };
    
  • 相关阅读:
    Expanding Rods(二分)
    Monthly Expense(二分)
    sdut1269 走迷宫(dfs)
    走迷宫(dfs)
    C Looooops(扩展欧几里得+模线性方程)
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
    37. Sudoku Solver
    36. Valid Sudoku
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/3079052.html
Copyright © 2011-2022 走看看