演算法課作業 歸納技術

2021-10-07 13:41:04 字數 4205 閱讀 2224

2-2 前t個組合結果 (20分)

2-3 排列還原 (25分)

2-4 行列式的計算 (20分)

返回主目錄

請編寫程式輸出前n個正整數的全排列(n<10),並通過9個測試用例(即n從1到9)觀察n逐步增大時程式的執行時間。

輸入格式:

輸入給出正整數n(<10)。

輸出格式:

輸出1到n的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a​1,a​2,⋯,a​n排在序列b1,b2,…,bn之前,如果存在k使得a1=b1,…ak=bk,並且ak+1輸入樣例:

3輸出樣例:

123132

213231

312321

#include

using namespace std;

const

int max_n =11;

int n;

int a[max_n]

=, visit[max_n]=;

//a陣列存放排列,從0開始;visit[i]標記數字i是否進入a陣列,從1開始;

void

output()

cout << endl;

}void

myperm

(int len)}}

}int

main()

組合結果

找出從自然數1、2、… 、n(0輸入格式:

在一行中輸入n、r、t(1<=t<=c(n,r))。

輸出格式:

按特定順序輸出前t個組合結果,每乙個組合結果佔一行,含第乙個整數在內的每乙個整數前面都用乙個空格,最後乙個整數後面沒有空格。 特定順序:每乙個組合結果中的值從大到小排列,組合之間按逆字典序排列。

輸入樣例:

在這裡給出一組輸入。例如:

5 3 10

6 4 8

輸出樣例:

在這裡給出相應的輸出。例如:

5 4 3

5 4 2

5 4 1

5 3 2

5 3 1

5 2 1

4 3 2

4 3 1

4 2 1

3 2 1

6 5 4 3

6 5 4 2

6 5 4 1

6 5 3 2

6 5 3 1

6 5 2 1

6 4 3 2

6 4 3 1

#include

using namespace std;

const

int max_n =30;

int n, r, t, counter =0;

int a[max_n]

;void

output()

cout << endl;

}void

tongbu

(int m)

void

perm

(int k)

}else}}

intmain()

perm

(r);

return0;

}

牛牛的作業簿上有乙個長度為n的排列a[1…n],這個排列包含了從1到n的n個數,但是因為某種原因,其中有一些位置(不超過10個)看不清了,但是牛牛記得這個排列的順序對的數量是k,順序對是指滿足i輸入格式:

輸入的第一行包含兩個整數n和k(1≤n≤100,1≤k≤n(n−1)/2),接下來的一行,包含n個數字表示排列a,其中等於0的項表示看不清的位置(不超過10個)。

輸出格式:

輸出一行表示合法排列的數目。

輸入樣例:

5 54 0 0 2 0

輸出樣例:

2

#include

using namespace std;

int n, k;

vector<

int> canpo;

void

pickupperm

(vector<

int>

&perm)

for(

int i =

0; i < n; i++)}

int num_perm=n-exist;

//num_perm表示全排列的數的數量

for(

int i =

0; i < num_perm; i++)}

void

createperm

(vectorint>

>

&changshi, vector<

int>

&perm)

while

(next_permutation

(perm.

begin()

, perm.

end())

);}void

mergeperm

(vectorint>

>

&merge, vectorint>

>

&changshi)

else

} merge.

push_back

(insert);}

}int

count

(const vectorint>

>

&merge)}if

(tmp == k)

ans++;}

return ans;

}int

main()

//得到需要全排列的數

vector<

int> perm;

pickupperm

(perm)

;//得到嘗試填入的數列

vectorint>

> changshi;

createperm

(changshi, perm)

;//將兩者合併

vectorint>

>merge;

mergeperm

(merge, changshi)

;//計算答案

cout <<

count

(merge)

<< endl;

return0;

}

根據二維矩陣a[1…n][1…n]的行列式的定義計算行列式的值det(a),其中涉及到1,2,…,n的全排列。輸入n及二維矩陣a[1…n][1…n],返回a的行列式的值det(a)。

輸入格式:

輸入的第一行包含乙個整數n(1≤n≤10),接下來的n行對應矩陣a的n行, 每行包含n個數。

輸出格式:

輸出a的行列式的值det(a)。

輸入樣例:

31 2 3

2 3 1

3 1 2

輸出樣例:

-18

#include

using namespace std;

int n;

//void perm1(int m, vector>& perm, vector& tmp)

// else

// }

//}void

getperm

(vectorint>

>

&perm)

dowhile

(next_permutation

(tmp.

begin()

, tmp.

end())

);//perm1(0, perm, tmp);//也可以用書上的perm1

}bool isroneven

(const vector<

int> one)}}

if(counter %2)

else

return true;

}int

productofoneperm

(const vector<

int> one,

const vectorint>

>v )

return res;

}int

det(

const vectorint>

> v)

else

}return ans;

}int

main()

} cout <<

det(v)

;return0;

}

演算法分析課作業

求陣列中最大的最小數之差 法一 temp 58,65,32,100,12,20,87,3,88 temp.sort print temp print temp.pop temp 0 結果 3,12,20,32,58,65,87,88,100 97法二 temp 58,65,32,100,12,20,...

演算法課作業 回溯法

7 2 子集和問題 20分 7 3 馬周遊問題 60分 返回主目錄 圖k 著色問題是乙個著名的np完全問題。給定無向圖g v,e 和正整數k,問可否用k種顏色為v中的每個結點分配一種顏色,使得不會有兩個相鄰結點具有同一種顏色?該問題的乙個具體例項可能會有多個解 乙個解就是一種合法的著色方案 要求計算...

演算法歸納(一)

1 給定乙個陣列arr,和乙個數num,請把小於等於num的數放在陣列的左邊,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n public class demo1 5 public static void sort int arr,int num print arr pub...