39. 組合總和 我的第一個DFS!
阿新 • • 發佈:2018-12-12
連結: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);
}
};