**深度優先搜索的用法——求數組部分和**
<table border="1" cellspacing="0" cellpadding="0" width="80%"><tbody><tr><td valign="top"><p><strong>問題主題:</strong>求數組部分和</p></td></tr><tr><td valign="top"><p><strong>問題描述:</strong></p><p>給定整數a1,a2, … an,判斷能否從中選出若干個數,使得它們的和為k。</p><p><strong>限制條件:</strong></p><p>1<=n<=20</p><p>-10<sup>8</sup><=a<sub>i</sub><=10<sup>8</sup></p><p>-10<sup>8</sup><=k<=10<sup>8</sup></p></td></tr><tr><td valign="top"><p><strong>樣例:</strong></p><p>輸入</p><p>n=4</p><p>a={1,2,4,7}</p><p>k=13</p><p>輸出</p><p>Yes (13=2+4+7)</p><p>輸入</p><p>n=4</p><p>a={1,2,4,7}</p><p>k=15</p><p>輸出</p><p>????No</p></td></tr></tbody></table>
### 【解法一】
### 解題分析:
???用遞歸的方法實現深度優先搜索,從a0開始依次判斷,決定ai加入或不加入,對每一個種組合進行判斷,決定是否存在和為k的情況。
### 程序實現:
**C++**
<table border="1" cellspacing="0" cellpadding="0" width="80%"><tbody><tr><td valign="top"><p align="left"><span style="color:blue">#include</span>?<span style="color:rgb(163,21,21)">"stdafx.h</span>"</p><p align="left"><span style="color:blue">#include</span>?<span style="color:rgb(163,21,21)">"iostream</span>"</p><p align="left">?</p><p align="left"><span style="color:blue">using</span>?<span style="color:blue">namespace</span>?std;</p><p align="left">?</p><p align="left"><span style="color:blue">const</span>?<span style="color:blue">int</span>?MAX = 10;</p><p align="left"><span style="color:blue">int</span>?????result;</p><p align="left"><span style="color:blue">int</span>?a[MAX];</p><p align="left"><span style="color:blue">int</span>?sum = 0;</p><p align="left">?</p><p align="left"><span style="color:blue">bool</span>?resolve(<span style="color:blue">int</span>?a[],?<span style="color:blue">int</span>?n,?<span style="color:blue">int</span>?i,?<span style="color:blue">int</span>?sum) ;</p><p align="left">?</p><p align="left"><span style="color:blue">int</span>?_tmain(<span style="color:blue">int</span>?argc, _TCHAR*?argv[]) {</p><p align="left">?????????<span style="color:blue">int</span>?n;</p><p align="left">?????????cout?<<?<span style="color:rgb(163,21,21)">"</span><span style="color:rgb(163,21,21)">請</span><span style="color:rgb(163,21,21)">?</span><span style="color:rgb(163,21,21)">輸</span><span style="color:rgb(163,21,21)">o?</span><span style="color:rgb(163,21,21)">入</span><span style="color:rgb(163,21,21)">¨?n</span><span style="color:rgb(163,21,21)">和</span><span style="color:rgb(163,21,21)">¨a</span><span style="color:rgb(163,21,21)">結</span><span style="color:rgb(163,21,21)">¨¢</span><span style="color:rgb(163,21,21)">果</span><span style="color:rgb(163,21,21)">?</span><span style="color:rgb(163,21,21)">的</span><span style="color:rgb(163,21,21)">ì?</span><span style="color:rgb(163,21,21)">大</span><span style="color:rgb(163,21,21)">?¨?</span><span style="color:rgb(163,21,21)">小</span><span style="color:rgb(163,21,21)">?:"</span>?<<endl;</p><p align="left">?????????cin?>> n >> result;</p><p align="left">?????????cout?<<?<span style="color:rgb(163,21,21)">"</span><span style="color:rgb(163,21,21)">請</span><span style="color:rgb(163,21,21)">?</span><span style="color:rgb(163,21,21)">輸</span><span style="color:rgb(163,21,21)">o?</span><span style="color:rgb(163,21,21)">入</span><span style="color:rgb(163,21,21)">¨?n</span><span style="color:rgb(163,21,21)">個</span><span style="color:rgb(163,21,21)">?</span><span style="color:rgb(163,21,21)">數</span><span style="color:rgb(163,21,21)">oy:"</span>?<<endl;</p><p align="left">?????????<span style="color:blue">for</span>(<span style="color:blue">int</span>?i=0;?i<n;?i++) {</p><p align="left">???????????????????cin?>> a[i];</p><p align="left">?????????}</p><p align="left">?????????<span style="color:blue">if</span>(resolve(a, n, 0, sum))</p><p align="left">???????????????????cout?<<?<span style="color:rgb(163,21,21)">"Yes"</span>?<<endl;</p><p align="left">?????????<span style="color:blue">else</span></p><p align="left">???????????????????cout?<<?<span style="color:rgb(163,21,21)">"No"</span>?<<?endl;</p><p align="left">?????????<span style="color:blue">return</span>?0;</p><p align="left">}</p><p align="left">?</p><p align="left"><span style="color:blue">bool</span>?resolve(<span style="color:blue">int</span>?a[],?<span style="color:blue">int</span>?n,?<span style="color:blue">int</span>?i,?<span style="color:blue">int</span>?sum) {</p><p align="left">?????????<span style="color:blue">if</span>(i?>= n)</p><p align="left">???????????????????<span style="color:blue">return</span>?sum == result;</p><p align="left">?????????<span style="color:green">//</span><span style="color:green">不</span><span style="color:green">?</span><span style="color:green">選</span><span style="color:green">?a[i</span>]</p><p align="left">?????????<span style="color:blue">if</span>(resolve(a, n, i+1, sum))</p><p align="left">???????????????????<span style="color:blue">return</span>?<span style="color:blue">true</span>;</p><p align="left">?????????<span style="color:green">//</span><span style="color:green">加</span><span style="color:green">¨?</span><span style="color:green">上</span><span style="color:green">|?a[i</span>]</p><p align="left">?????????<span style="color:blue">if</span>(resolve(a, n, i+1,?sum+a[i]))</p><p align="left">???????????????????<span style="color:blue">return</span>?<span style="color:blue">true</span>;</p><p align="left">?????????<span style="color:blue">return</span>?<span style="color:blue">false</span>;</p><p align="left">}</p><p>?</p></td></tr></tbody></table>
**Java**
<table border="1" cellspacing="0" cellpadding="0" width="80%"><tbody><tr><td valign="top"><p/><pre code_snippet_id="142845" snippet_file_name="blog_20140105_1_6613798" name="code" class="java">/**
* User: luoweifu
* Date: 14-1-7
* Time: 上午11:33
*/
public class PartSum {
private int array[];
private int result;
public PartSum() {
}
public PartSum(int[] array, int result) {
this.array = array;
this.result = result;
}
public void setArray(int[] array) {
this.array = array;
}
public void setResult(int result) {
this.result = result;
}
public boolean resolve(int[] array, int i, int sum) {
int n = array.length;
if(i >= n)
return sum == result;
if(resolve(array, i+1, sum))
return true;
if(resolve(array, i+1, sum+array[i]))
return true;
return false;
}
public void partsumResolve() {
if(resolve(array, 0, 0))
System.out.println("Yes");
else
System.out.println("No");
}
public static void main(String args[]) {
PartSum partSum = new PartSum(new int[]{1,2,4,7}, 13);
partSum.partsumResolve();
partSum.setResult(15);
partSum.partsumResolve();
}
}</pre><br/><br/><p/></td></tr></tbody></table>
****
### 算法復雜度:
???時間復雜度O(2n)