今天和大家分享一篇深度優先窮竭算法,不廢話直接進入正題
有這麼一個數組1,2,3,4,5,7,8,11,12,15,21,33,問有沒有幾個數組之和相加等於51的
這種問題可以用窮竭算法來解決,大致思路是這樣的
從第一個數字開始,選擇加不加第二個數字,分爲加或者不加,然後下一步在加和不加中分別右選擇加不加第三個數字,依次類推,這就是一個遞歸,下面給出一個圖方便大家理解
沒有畫完,一直往下加下去,有點像二叉樹是不是,因爲每一個節點都會選擇加或者不加,那麼它的時間複雜度就是O(2^n)
這是一個非常大的數字,所以這個並不是最優算法,下面給出代碼
public class DeepExhaust {
static final int n=12, k = 51;
static final int[] a = new int[]{1,2,3,4,5,7,8,11,12,15,21,33};
/**
*
* @param i 個數
* @param sum 當前總和
* @return
*/
public static boolean deepExhaust(int i,int sum){
//已經找到最後一個都沒找到
if(i == n){
return sum == k;
}
//不加a[i]
if(deepExhaust(i+1, sum)){
System.out.println("不加:"+a[i]);
return true;
}
//加a[i]
if(deepExhaust(i+1, sum + a[i])){
System.out.println("加:"+a[i]);
return true;
}
return false;
}
public static void main(String[] args) {
boolean dfs = deepExhaust(0,0);
System.out.println(dfs);
}
}
我們看到這裏面首先進來判斷一下是否已經循環完整個數組,如果循環完了,則返回當前總和是否等於給定數字k
如果沒有到最後一個,則選擇分叉加或者不加,裏面用遞歸進行處理,不多說
最後都沒有找到則返回false
以上就是深度窮竭算法處理這種問題,之後還會分享更優算法