方法一:遞迴求解
(1)、從 n 個元素中,選擇 m 個元素的組合
#includeusingnamespace
std;
int ans[10],a[20
],m,n;
bool visited[20];
void
output()
void work(int i,intk)
for(;k<=n;k++) //
flag1
} }
intmain()
work(
1,1);
}return0;
}
輸入:3 2
1 3 5
輸出:1 3
1 53 5
(2)、從n
個元素中選擇
m個元素的排列
只需在flag1
出的for
迴圈中k=1
輸入:3 2
1 3 5
輸出:1 3
1 53 1
3 55 1
5 3(3)、從n
個元素中選擇
m個元素的可重複組合
只需把flag2
出的visitted
注釋掉輸入:
3 31 3 5
輸出:1 1 1
1 1 3
1 1 5
1 3 3
1 3 5
1 5 5
3 3 3
3 3 5
3 5 5
5 5 5
方法二:狀態壓縮
(1)、從
n個元素中選擇
m個元素的組合
#include#include#include
using
namespace
std;
int a[20],p[20
],m,n;
bool judge(int x)//
判斷x轉換成二進位制中1的個數
if(cnt==m) return
true
;
return
false;}
void
work()
printf("\n
");}
}}int
main()
work();
}return0;
}
輸入:3 2
輸出:1 3
1 53 5
方法三:使用stl
中的 next_permutation 函式
(1)生成全排列
#include#include#include
using
namespace
std;
int p[20
],n;
void
work()
while(next_permutation(p,p+n));
//prev_permutation(p,p+n)
//生成降序
}int
main()
work();
}return0;
}
輸入:3
3 1 5
輸出:1 3 5
1 5 3
3 1 5
3 5 1
5 1 3
5 3 1
深搜練習 生成組合數
0.總結 get to the key point firstly,the article comes from lawsonabs 1.要求 從乙個有n個數的集合 無重複數字 中選擇m個數的集合出來,要做到不重不漏。2.思路 2.1分治 在這 n 個數中,每個數都有選或不選兩種選擇。於是問題就轉換...
利用字典序法生成組合數
在組合數學的這本書中,生成組合數字有很多中方法,比較常用的序數法,字典序法 本文採用字典序法,生成一堆組合數字,即c n,r 從n個數字中取得r個,演算法完整的定義如下 從中取r 組合表示為c1c2 cr,令c1 c2 cr,其中有i ci n r i i 1,2,r 第乙個組合為 生成後序組合的規...
排列和組合
排列組合計算公式 排列a n,m n n 1 n m 1 n!n m n為下標,m為上標,以下同 組合c n,m a n,m a m,m n!m!n m 問題 從1到n 包含 中選出m n個數,在下列情況下,有多少種組合?限制條件 1 無限制 2 各位數字公升序排列 3 不能有重複數字 4 各位數字...