LeetCode-Combination Sum

class Solution {
public:
    vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        sort(candidates.begin(), candidates.end(), comp);
        vector<vector<int> > G(candidates.size() + 1, vector<int>(target + 1, 0));
        vector<int> F(target + 1, 0);
        for (int i = 1; i <= candidates.size(); ++i)
        {
            for (int v = candidates[i - 1]; v <= target; ++v)
            {
                int newVal = F[v - candidates[i - 1]] + candidates[i - 1];
                if (F[v] > newVal)
                {
                    G[i][v] = 0;
                }
                else if (F[v] < newVal)
                {
                    G[i][v] = 1;
                    F[v] = newVal;
                }
                else
                {
                    G[i][v] = 2;
                }
            }
        }
        vector<vector<int> > combinations;
        vector<int> curCombination;
        if (F[target] == target)
        {
            getCombinations(curCombination, combinations, candidates.size(), target, G, candidates);
        }
        return combinations;
    }
    
private:
    void getCombinations(vector<int> &curCombination, vector<vector<int> > &combinations, int i, int v,
        const vector<vector<int> > &G, const vector<int> &candidates)
    {
        if (i == 0 || v == 0)
        {
            if (curCombination.size() > 0)
            {
                combinations.push_back(curCombination);
            }
            return;
        }
        
        if (G[i][v] == 0)
        {
            getCombinations(curCombination, combinations, i - 1, v, G, candidates);
        }
        else if (G[i][v] == 1)
        {
            curCombination.push_back(candidates[i - 1]);
            getCombinations(curCombination, combinations, i, v - candidates[i - 1], G, candidates);
        }
        else
        {
            vector<int> tmp = curCombination;
            getCombinations(curCombination, combinations, i - 1, v, G, candidates);
            tmp.push_back (candidates[i - 1]);
            getCombinations(tmp, combinations, i, v - candidates[i - 1], G, candidates);
        }
    }
    
    static bool comp(int a, int b)
    {
        return a > b;
    }
        
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章