zoukankan      html  css  js  c++  java
  • Leetcode 39. Combination Sum

    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.
    • 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]
    ]


    之前想的方法是构建出一个vector,vector里包含所有可能的数字的数量,例如当target是7的时候,构建出来的vector是[2,2,2,3,3,6,7].然后利用类似滑动窗口的机制去解决问题。
    这种方法最大的问题就是,求得出来的组合都是连续的,不符合题意。

    在网上查了一下,据说是多重背包问题。之后再看关于背包问题的总结,算法导论有名的0-1背包,部分背包等等。
    这道题用深度优先搜索DFS的思想可以解决。代码部分思路很清晰,不赘述。

    class Solution {
    public:
        vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
            vector<vector<int> > ret;
            if(target<0)
                return ret;
            vector<int> tmp;
            sort(candidates.begin(),candidates.end());
            DFS(0,candidates,0,target,ret,tmp);
            return ret;
        }
        
        void DFS(int depth,vector<int> candidates,int cursum,int target,vector<vector<int>>& ret,vector<int>& tmp){
            if(depth==candidates.size()){
                if(cursum==target)
                    ret.push_back(tmp);
                return;
            }
            if(cursum==target){
                ret.push_back(tmp);
                return;
            }
            if(target-cursum<candidates[depth])
                return;
            for(int i=0;candidates[depth]*i+cursum<=target;i++){
                for(int j=0;j<i;j++)
                    tmp.push_back(candidates[depth]);
                DFS(depth+1,candidates,cursum+i*candidates[depth],target,ret,tmp);
                for(int j=0;j<i;j++)
                    tmp.pop_back();
            }
            return;
        }
    };


  • 相关阅读:
    一行代码搞定Dubbo接口调用
    测试周期内测试进度报告规范
    jq 一个强悍的json格式化查看工具
    浅析Docker容器的应用场景
    HDU 4432 Sum of divisors (水题,进制转换)
    HDU 4431 Mahjong (DFS,暴力枚举,剪枝)
    CodeForces 589B Layer Cake (暴力)
    CodeForces 589J Cleaner Robot (DFS,或BFS)
    CodeForces 589I Lottery (暴力,水题)
    CodeForces 589D Boulevard (数学,相遇)
  • 原文地址:https://www.cnblogs.com/LUO77/p/5587026.html
Copyright © 2011-2022 走看看