• 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);
            }
        }
    };
    
  • 相关阅读:
    【洛谷 4613】Olivander
    【洛谷 1385】密令
    【洛谷 4439】Aron
    【洛谷 3383】线性筛素数
    【洛谷 2412】查单词
    【洛谷 1980】计数问题
    【洛谷 3372】(模板)线段树 1
    Luogu P3743 kotori的设备
    Luogu P2340 [USACO03FALL]Cow Exhibition G
    Luogu P3047 [USACO12FEB]Nearby Cows G
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/3079052.html
Copyright © 2020-2023  润新知