演算法練習 排列組合之組合和

2021-09-07 05:18:25 字數 2012 閱讀 2263

給出一組不同的正整數序列和乙個目標值,求出全部可能的組合,使得組合裡全部元素和為目標值。

要求:1)每乙個組合裡的元素依照公升序排列。

2)輸出組合裡不含有反覆的組合。

3)輸入序列中的整數能夠多次使用。

舉例:輸入

,目標值為7

輸出。。

為了讓輸出元素按公升序排列,可對輸入序列進行排序。

同這裡我們使用遞迴的方法來解決這個組合問題,即典型的for

語句內呼叫遞迴函式。須要注意下面幾點:

1)記錄剩餘目標值和,僅僅有當該值為0

時。組合才是有效的。

2)記錄當前位置,由於序列中的數能夠反覆使用,所下面一次遞迴時,還能夠從當前位置開始。這將體如今遞迴函式的引數裡。

詳細可參看**實現中的getresultset函式。

假設序列中可能有同樣的元素。而且每乙個元素最多僅僅能使用一次,那麼又該怎麼處理?相對於之前的問題,這裡有兩個變化:1)每乙個元素最多僅僅能使用一次,下次遞迴時是不能從當前位置開始的,而是從下乙個開始。

2)因為序列中含有相等的元素,哪怕每乙個元素最多僅僅使用一次,也可能出現反覆的組合,所以。為了避免反覆,僅僅取第乙個同樣元素。

詳細可參看**實現中的getresultsetex函式。

#include #include #include using namespace std;

typedef vectorintarray;

//結果集

typedef vector> resultset;

resultset gresultset;

//原始序列中不含同樣的值

void getresultset( const intarray& msrcarray, int ntarget,

intarray& mdstarray, int istart )

else }

}//序列中可能有同樣的元素。而且每乙個元素最多僅僅能使用一次。不含反覆組合

void getresultsetex( const intarray& msrcarray, int ntarget,

intarray& mdstarray, int istart )

else }

}//輸出結果集

void outputresultset()

cout << endl;

} } cout << "總共結果數:" << gresultset.size() << endl;

cout << "---------------------------------------" << endl;

}int main()

cin >> ntarget;

//從小到大排序

sort( msrcarray.begin(), msrcarray.end() );

mdstarraytemp.clear();

gresultset.clear();

//getresultset( msrcarray, ntarget, mdstarraytemp, 0 );

getresultsetex( msrcarray, ntarget, mdstarraytemp, 0 );

//輸出結果

系列文章說明:

1.本系列文章[演算法練習],不過本人學習過程的乙個記錄以及自我激勵,沒有什麼說教的意思。

假設能給讀者帶來些許知識及感悟。那是我的榮幸。

2.本系列文章是本人學習陳東鋒老師《進軍矽谷。程式猿面試揭秘》一書而寫的一些心得體會,文章大多數觀點均來自此書,特此說明!

3.文章之中,難免有諸多的錯誤與不足,歡迎讀者批評指正,謝謝.

演算法 排列組合

a m,n n n m 從 n 個數中取 m 個有前後順序的數列 有 a m,n 種方式 c m,n n n m m a m,n m 從 n 個數中取 m 個無前後順序的數列 有 c m,n 種方式 性質 c m,n c n m,n c r,n 1 c r 1,n c r,n 楊輝三角性質 c 0,...

排列組合相關演算法

排列生成演算法 問題 給出數字a1,a2,an,生成所有排列。如果用遞迴,這個演算法執行時的遞迴深度會很大的,而且遞迴如何乙個乙個地返回排列結果呢。下面的演算法的核心思想都是如何根據當前給定的排列p 第乙個排列自然是p a1a2.an了 然後生成唯一的下乙個排列。如此迴圈n 次,自然獲得所有的排列。...

排列組合演算法

在開發的過程中很難免會到排列組合,剛開始通過for迴圈來搞定。但是對於工作了近五年的我而已,不能像 新人那樣做了。如果所要組合的集合大於40,你不可能寫40個for迴圈吧!這裡使用了數學的演算法,到底是啥演算法,高人也沒說!不過我把它的思想提公升了一下。如下 ifndef combination h...