索引:[LeetCode] Leetcode 題解索引 (C++/Java/Python/Sql)
Github: https://github.com/illuz/leetcode
039. Combination Sum (Medium) 連結:
題目:https://leetcode.com/problems/combination-sum/
代碼(github):https://github.com/illuz/leetcode 題意:
給出一些正整數集合,以及一個目標數,從集合中選擇一些數使得它們的和等於目標數,可以重複選擇集合裡的數。
得到的解的集合不能有重複。 分析:
暴力搜尋過去是可以的,先排好序,然後用 DFS,每次有兩種選擇,一是選中當前的數然後遞迴當前數,二是不選當前數直接遞迴下個數。
這題用來理解 DFS 是很不錯的。 代碼: (C++)
/** 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;}