排列和組合列舉都是暴力基礎啦,雖然很簡單但是總結一下比較好
組合
先從簡單的說起吧,比如說從n個數里選k個
先放**:
void combination(int cur,int cnt)//cur為當前數,cnt為已選擇數的個數
} conbination(1,0);
(這裡的n, k, cur, cnt均指序號)
這種思路並不難理解,要保證每一位數前面都沒有出現,可以直接從小到大,每一位都列舉上一位後面的數,通過遞迴就能把所有的組合都列舉出來啦。
排列
最準確的排列演算法是通過一步步進化來的
again,比方說從n個數里選出k個進行排列
最傻白甜的乙個寫法:
bool check(int i,int n)
可以但不行
所以我們會想到開乙個計數器ci,記錄每個數字一共出現了幾次。
然後這樣:
bool check(int i,int n,int c1)
void permutation(int cnt)
}}
挺麻煩的,但是能做對
但是,如果去考試的話,c++裡其實有庫可以直接用...
乙個叫next_permutation的神奇函式
這時我們假設將要排列列舉的陣列為p
#include#include//演算法標頭檔案
using namespace std;
int main()
while(next_permutation(p+1,p+n+1));
return 0;
}
(還有這種操作???.jpg)
遞迴列舉排列組合
從1 n這n n 20 個整數中隨機取出任意多個,輸出所有的可能選擇方案。2的n次方種 思路 使用遞迴實現,每次遞迴分別嘗試對每乙個數進行選或者不選的操作,尚未確定的整數數量減少1.vector int chosen class solution calc x 1,n,result chosen.p...
暴力列舉 洛谷入門
問題一 p2241 統計方形 資料加強版 題目描述 有乙個 n m 方格的棋盤,求其方格包含多少正方形 長方形 不包含正方形 輸入格式 一行,兩個正整數 n 5000,m 5000 輸出格式 一行,兩個正整數,分別表示方格包含多少正方形 長方形 不包含正方形 輸入輸出樣例 輸入 2 3輸出 8 10...
暴力求解法 之 列舉排列
1 生成1 n的排列 include includeconst int n 1e3 10 int a n void print permutation int n,int a,int cur int i,j if cur n 遞迴邊界 for i 0 i 2 生成可重集的排列 上面求排列的程式只適用...