微軟演算法100題21 數列中所有和為特定值的組合

2022-04-03 10:06:33 字數 1369 閱讀 3027

第21 題

程式設計求解:

輸入兩個整數n 和m,從數列1,2,3.......n 中隨意取幾個數,

使其和等於m ,要求將其中所有的可能組合列出來

思路:典型的01揹包問題,按照揹包問題的思路,可以將問題:f(n,m),分解為f(n-1,m)和[f(n-1,m-n),n]兩個子問題

就是n個數裡面和等於m的元素組合,一定包含n-1個數里所有和為m的組合,再加上n-1個數里所有和為m-n的組合,再加上n這個元素

為了記錄所有符合要求的元素,可以用乙個大小為n的整數陣列來標記數列1到n的元素狀態,如果元素n符合要求,則marks[n-1]=1,否則marks[n-1]=0

這裡需要考慮的是何時標記為1?何時標記為0?  對於子問題f(n-1,m-n)來說,我們需要把元素n標記為1,因為如果f(n-1,m-n)有符合要求的元素的話,元素n也符合要求。對於子問題f(n-1,m)來說,我們需要把元素n標記為0,即元素n不符合要求,因為子問題f(n-1,m)已經將n排除在外了。

這裡我們使用遞迴來解決揹包問題,最佳方法仍是動態規劃,這個留到以後。

1

package

com.rui.microsoft;23

4/**

5* 第21 題

6程式設計求解:

7輸入兩個整數n 和m,從數列1,2,3.......n 中隨意取幾個數,

8使其和等於m ,要求將其中所有的可能組合列出來9*

10*/

11public

class

test21_01bag

1920

public

static

void print(int

marks)25}

26 system.out.println("");27}

2829

public

static

void find(int n, int m, int

marks)

4243

//先標記元素n,然後遞迴解決子問題f(n-1,m-n)

44//

因為子問題f(n-1,m-n)所包含的符合條件的元素組合再加上元素n才能得到最終解,所以元素n標記為1

45 marks[n-1]=1;

46 find(n-1,m-n,marks);

4748

//先標記元素n,然後遞迴解決子問題f(n-1,m)

49//

此時元素n已經被排除在子問題f(n-1,m)之外了,所以將其標記為0

50 marks[n-1]=0;

51 find(n-1,m,marks);52}

53 }

微軟演算法100道題

題目 n個數字 0,1,n 1 形成乙個圓圈,從數字0開始,每次從這個圓圈中刪除第m個數字 第乙個為當前數字本身,第二個為當前數字的下乙個數字 當乙個數字刪除後,從被刪除數字的下乙個繼續刪除第m個數字。求出在這個圓圈中剩下的最後乙個數字。思路 這道題的思路。分析 既然題目有乙個數字圓圈,很自然的想法...

演算法題12 陣列中所有的逆序對

題目 求乙個陣列中所有的逆序對數,如陣列arr 逆序對有5,2 5,4 9,8 9,6 8,6 逆序對數為5 分析 因為陣列不是排序的,所以要找乙個元素後面所有比它小的數,最直觀的想法是依次遍歷後續的元素。這樣做的時間複雜度為o n 除此之外,涉及兩個元素間相互比較的計算在陣列的排序演算法中最為常見...

微軟演算法100題26 左旋轉字串

26.左旋轉字串 題目 定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef 左旋轉2 位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n 的字串操作的複雜度為o n 輔助記憶體為o 1 思路 先反轉整個字串 fedcba 在分別反轉各個子字串 fedc...