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;
}
};
LeetCode-Combination Sum
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.