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);
            }
        }
    };
    
  • 相关阅读:
    线段树【加强】
    ATM(BZOJ 1179)
    Trick or Treat on the Farm
    欧拉回路 HDU
    无序字母对(luogu 1314)
    MooFest
    Snowflake Snow Snowflakes(POJ 3349)
    Firetruck(UVA 208)
    B进制星球(luogu 1604)
    遍历一个树的所有子节点,画出该树,深度不定,广度不定,适用于任何树,深度优先算法
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/3079052.html
Copyright © 2011-2022 走看看