索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql)
Github:
https://github.com/illuz/leetcode
题目:https://leetcode.com/problems/combination-sum/
代码(github):https://github.com/illuz/leetcode
给出一些正整数集合,以及一个目标数,从集合中选择一些数使得它们的和等于目标数,可以重复选择集合里的数。
得到的解的集合不能有重复。
暴力搜索过去是可以的,先排好序,然后用 DFS,每次有两种选择,一是选中当前的数然后递归当前数,二是不选当前数直接递归下个数。
这题用来理解 DFS 是很不错的。
/* * Author: illuz <iilluzen[at]gmail.com> * File: AC_dfs_n!.cpp * Create Date: 2015-01-01 10:45:58 * Descripton: dfs, choose or not choose */ #include <bits/stdc++.h> using namespace std; const int N = 0; class Solution { private: void dfs(vector<vector<int> > &ans, vector<int> &single, vector<int> &candi, int cur, int rest) { int sz = candi.size(); if (sz <= cur || rest < 0) return; if (rest == 0) { ans.push_back(single); return; } // choose cur single.push_back(candi[cur]); dfs(ans, single, candi, cur, rest - candi[cur]); single.pop_back(); // don't choose cur dfs(ans, single, candi, cur + 1, rest); } public: vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<vector<int> > ans; vector<int> single; sort(candidates.begin(), candidates.end()); dfs(ans, single, candidates, 0, target); return ans; } }; int main() { int tar; int n; Solution s; cin >> n >> tar; vector<int> v(n); for (int i = 0; i < n; i++) cin >> v[i]; vector<vector<int> > res = s.combinationSum(v, tar); for (auto &i : res) { for (auto &j : i) cout << j << ' '; puts(""); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
[LeetCode] 039. Combination Sum (Medium) (C++)
原文地址:http://blog.csdn.net/hcbbt/article/details/47354777