題目:
給定乙個非負整數陣列,a1, a2,..
., an, 和乙個目標數,s。現在你有兩個符號 + 和 -。對於陣列中的任意乙個整數,你都可以從 + 或 -中選擇乙個符號新增在前面。
返回可以使最終陣列和為目標數 s 的所有新增符號的方法數。
示例 1
:輸入: nums:[1
,1,1
,1,1
], s:
3輸出:
5
解釋:-1
+1+1
+1+1
=3+1
-1+1
+1+1
=3+1
+1-1
+1+1
=3+1
+1+1
-1+1
=3+1
+1+1
+1-1
=3一共有5種方法讓最終目標和為3。
注意:陣列非空,且長度不會超過20。
初始的陣列的和不會超過1000。
保證返回的最終結果能被32位整數存下。
分析:
首先,最簡單的方法就是暴力法,我們求出所有的組合方法,對於每種結果進行判斷是否符合s的要求
求出所有結果的空間複雜度為 2
^n如何實現暴力求解呢?
對於每乙個元素,都有 +
-兩種方法,如果畫出流程其實就是乙個樹形結構,很容易想到利用dfs的方法,
找到所有尾部結點,並回溯到之前的結點計算另一種情況下的目標和;
首先判斷結束遞迴的條件:1. 如果已經到達最深處(這裡的dfs會在到達 size大小時返回),需要判斷是否結果為想要的,如果是則記錄,不是則返回;
接著:在遞迴函式中需要將 +
-分開呼叫;最後return;
class
solution
dfs(nums,i+
1,m,s,cur_count+nums[i]
,ret_count)
;dfs
(nums,i+
1,m,s,cur_count-nums[i]
,ret_count);}
intfindtargetsumways
(vector<
int>
& nums,
int s)
};
整數劃分問題 遞迴,dfs求解
給定任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。當n 7,共有14種拆分方法 這道題目我們可以想到其實應該用遞迴來做,而dfs又是可以使用遞迴求解,我們首先可以在遞迴函式裡進行拆分的列舉,需要拆分的數應該是能夠由哪一些數相加,怎樣設計遞迴函式dfs呢,我們應該清楚應該拆分n,比如...
主方法求解遞迴式
求解遞迴式的方法有akra bazzi方法和strassen方法等等,但是akra bazzi方法有點難用,但它可以求解那些子問題劃分不均衡的演算法的遞迴式。主方法很容易使用,但只能用於子問題規模相等的情況。這幾天看了點對遞迴式進行求解,稍微了解到可以通過主方法很快的把使用分治策略解決的問題的時間複...
C 使用遞迴和非遞迴方式實現BFS和DFS
c 使用遞迴和非遞迴方式實現bfs和dfs include include include using namespace std int visiteddfs 5 int visitedbfs 5 int count dfs 0 int count dfs 0 int count bfs 0 in...