第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排除在外了。
這裡我們使用遞迴來解決揹包問題,最佳方法仍是動態規劃,這個留到以後。
1package
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...