1. 程式人生 > >39. 組合總和 我的第一個DFS!

39. 組合總和 我的第一個DFS!

連結:https://leetcode-cn.com/problems/combination-sum/description/
一看題目就覺得很熟悉,這不是化簡後的揹包問題嗎!憑著記憶將DFS寫出來,發現其實也沒那麼難!
本題是可以重複選,如果是不重複,則將
DFS(index,sum+number[index],target);
改為
DFS(index+1,sum+number[index],target);
意思即為選第index號物品,同時index+1,這樣再選的話就不會跟當前物品相同了~

2018年9月29日19:37:40更新!!
—在DFS中 要先判斷是否相等 再判斷是否不合格,如果先判斷不合格(如index==size())則會漏掉某些特殊的答案!!

//這樣寫是錯的!!!
   if(sum>target||index==number.size()) return;
        else if(sum==target)
        {
            ans.push_back(temp);
            return;
        }

AC程式碼

class Solution {

public:
    vector<int>temp;
    vector<vector<int> > ans;
    vector<int> number;
    vector<
vector<int> > combinationSum(vector<int>& candidates, int target) { number=candidates; DFS(0,0,target); return ans; } //深度優先搜尋 void DFS(int index,int sum,int target) { //對於所有情況 //sum>target return //sum<target 繼續遞迴 //sum==target ans.push
//index=到最後一個元素+1或者溢位 return //這樣判斷才對!!! if(sum==target) { ans.push_back(temp); return; } else if(sum>target||index==number.size()) return; //對於選擇 //先選index號數字,嘗試組合出target,先壓入temp,然後sum再傳入值 temp.push_back(number[index]); DFS(index,sum+number[index],target); temp.pop_back(); //如果條件不滿足 則從temp中彈出,然後index+1,再傳入DFS中 DFS(index+1,sum,target); } };