深度優先窮竭算法

今天和大家分享一篇深度優先窮竭算法,不廢話直接進入正題

有這麼一個數組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

以上就是深度窮竭算法處理這種問題,之後還會分享更優算法

發佈了65 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章