2-2 前t個組合結果 (20分)
2-3 排列還原 (25分)
2-4 行列式的計算 (20分)
返回主目錄
請編寫程式輸出前n個正整數的全排列(n<10),並通過9個測試用例(即n從1到9)觀察n逐步增大時程式的執行時間。
輸入格式:
輸入給出正整數n(<10)。
輸出格式:
輸出1到n的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a1,a2,⋯,an排在序列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...