无相同元素 排列A(n,m) 组合C(n,m) 有相同元素 排列A(n,m) 组合C(n,m)
最近刚刚学习了递归,回溯算法来进行深度搜索。对一些题目有一些感触,顺便写下变体的解法。
此类深搜主要分为无相同元素和有相同元素,下面又分好几种情况。
无相同元素 void dfs(int i){ if(n==i){
for(int j=0;jn;j++) printf(\"%5d\ printf(\"\");
for(int j=1;j=n;j++) if(b[j]==0){ dfs(i+1); 例题1:
问题 A: 全排列问题
时间限制:?1 Sec?内存限制:?128 MB 提交:?123?解决:?71
[提交][状态][讨论版][命题人:?外部导入] 题目描述
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入 n(1≤n≤9)
由1~n组成的所有不重复的数字序列,每行一个序列。每个数字占5列。 样例输入 样例输出 [提交][状态] 排列A(n,m)
void dfs(int i,int l){ if(l==n){
for(int j=0;jn;j++) coutb[j];
for(int j=0;jm;j++) if(a[j]==0){ b[i]=j+1; dfs(i+1,l+1);
例题2:
问题 B: 输出N个不同字母的全排列 时间限制:?1 Sec?内存限制:?128 MB 提交:?223?解决:?83
[提交][状态][讨论版][命题人:?外部导入] 题目描述
输入正整数n(n<10),输出ABCD.n个不同字母的全排列,输出时按升序每行显示一个结果 正整数N(N<10)
N个字母的全排列,升序排列,每行一个 样例输入 【测试样例1】 【测试样例2】 【测试样例3】 【测试样例4】 样例输出 【测试样例1】 【测试样例2】 【测试样例3】 【测试样例4】 [提交][状态] 组合C(n,m)
void dfs(int i,int l,int k){ if(l==n){
for(int j=0;jn;j++) coutb[j];
for(int j=k;jm;j++){ if(a[j]==0){ b[i]=j+1; dfs(i+1,l+1,k); 问题 D: 组合的输出
时间限制:?1 Sec?内存限制:?128 MB 提交:?111?解决:?64
[提交][状态][讨论版][命题人:?外部导入] 题目描述
排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。 现要求你用递归的方法输出所有组合。 例如n=5,r=3,所有组合为:
l 2 3 l 2 4 1 2 5 l 3 4 l 3 5 1 4 5 2 3 4 2 3 5 2 4 5? 3 4 5
一行两个自然数n、r(1n21,1=r=n)。
所有的组合,每一个组合占一行且其中的元素按由小到大的顺序
排列,每个元素占三个字符的位置,所有的组合也按字典顺序。 样例输入 样例输出 [提交][状态] 有相同元素 #include iostream #includemap
using namespace std; int a[15]={0}; char b[15]; char c[15]; mapchar,int counts; void dfs(int i){ if(i==n){
for(int j=0;jn;j++) coutb[j];
for(mapchar,int::iterator
it=counts.begin();it!=counts.end();it++) if(it-second!=0){ b[i]=it-first; it-second--; dfs(i+1);
it-second++; int main(){
cout\"有相同元素全排列\"endl; cout\"输入元素\"endl; for(int i=0;in;i++){ if(counts.count(c)==0) counts[c]=1; counts[c]++;
问题 E: 有重复元素的排列问题 时间限制:?1 Sec?内存限制:?128 MB 提交:?147?解决:?62
[提交][状态][讨论版][命题人:?外部导入] 题目描述
设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn可能相同。试设计一个算法,列出R的所有不同排列。
给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
输入数据的第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。
计算出的n个元素的所有不同排列并输出。文件最后1行中的数是排列总数。
样例输入 样例输出 [提交][状态] 问题 C: 排列棋子
时间限制:?1 Sec?内存限制:?128 MB 提交:?135?解决:?96
[提交][状态][讨论版][命题人:?外部导入] 题目描述
将M个白棋子与N个黑棋子排成一行,可以排成多种不同的图案。例如:2个白棋子和2个黑棋子,一共可以排成如下图所示的6种图案(根据组合数计算公式:)
请你编写一段程序,输出M个白棋子与N个黑棋子能够组成的所有图案。
为了避免程序输出结果过多导致严重超时,特别限制:1≤M,N≤6 两个正整数M,N表示白棋子与黑棋子的数量,并且满足1≤M,N≤6?
M个白棋子与N个黑棋子可以排列的所有图案。?
要求:每行输出一种图案,白棋子用0表示,黑棋子用1表示,按升序输出 样例输入
span style=\"color:#333333\"【测试样例1】 【测试样例2】
【测试样例3】 样例输出
span style=\"color:#333333\"【测试样例1】 【测试样例2】 【测试样例3】 11100-span [提交][状态]
以上例题均来自WLACM?
if (tempCollection.size() == count) { ll exgcd(ll a,ll b,ll x,ll y){
此时i3已经移动到数组末尾,我们开始调整上一级游标,此时i1指向1,i2指向4,i3指向5。算法开始时,我们首先移动最后一个游标i3:
public static void main(String[] args) { C(n,m)=A(n,m)-A(m,m)=A(n,m)-m! for(intj=0;ja.length;j++){
组合可重复问题放在最后,先看组合不可重复。先看例子,共有红黄蓝绿黑5种颜色的球,随机取3次有几种颜色组合。{红、绿、黄}和{黄、绿、红}虽然顺序不同,但是相同的组合,即只算一种情况。同时,不可能出现{红、红、黄},即这是一个不可重复问题。 System.out.print(a[i] + \" \");
return (int) ((double) divisor - dividend);
sb.append(list[i]).append(\
因篇幅问题不能全部显示,请点此查看更多更全内容