組合數的題型

2022-03-18 10:26:46 字數 3030 閱讀 9111

#if 0

// 對於求c(n, m),從第乙個字元開始掃瞄,每個字元有兩種情況,要麼被選中,要麼不被選中,如果被選中,遞迴求解c(n-1, m-1)。

// 如果未被選中,遞迴求解c(n-1, m)。不管哪種方式,n的值都會減少,遞迴的終止條件n=0或m=0。

// 陣列的全組合數

void combination(vectorsrc, int i,int m, vector&res, vector> &vecs)

if (m==0) //遞迴終止條件

//選擇該元素

res.push_back(src[i]);

combination(src, i + 1, m - 1, res, vecs);

res.pop_back();

//不選該元素

combination(src, i+1, m, res, vecs);

return;

}int main()

vector> vecs;

vectorvec;

//combination(input,0, m, vec, vecs); ////c(n,m)

for (int i = 1; i <= n;i++) //c(n, 1), c(n, 2),...c(n, n)的總和

科室素拓進行遊戲,遊戲規則如下:隨機抽取9個人作為遊戲參與人員,分別編號1至9,每輪要求k(k<=9且k>=0)個人自由組合使編號之和為n。輸出滿足規則的所有可能的組合。要求組合內部編號公升序輸出,組合之間無順序要求。

輸入描述:

輸入資料為以空格分隔的兩個整數k和n

輸出描述:

每行輸出乙個可能的編號組合,組合內部各個編號以空格分隔公升序輸出。若無滿足規則的組合,則輸出none

示例1輸入

3 15

輸出1 5 9

1 6 8

2 4 9

2 5 8

2 6 7

3 4 8

3 5 7

4 5 6

#include#include#include #include #include #include #include #include #include #include #include #include #include #include //accmulate

#include //ostream_iterator

#include #include //setprecision() setw()

using namespace std;

//#define cin infile //一定不能再oj系統中,有錯,導致超時等!!!

//c++檔案輸入

ifstream infile("in.txt", ifstream::in);

#include #define int_min (-2147483647 - 1) /* minimum (signed) int value */

#define int_max 2147483647 /* maximum (signed) int value */

#if 1

bool flag = false;

void combination(vectorsrc, int i, int m, vector&res, vector> &vecs,int target)

if (m == 0) //遞迴終止條件,個數

return;

} //選擇該元素

res.push_back(src[i]);

combination(src, i + 1, m - 1, res, vecs,target);

res.pop_back();

//不選該元素

combination(src, i + 1, m, res, vecs,target);

return;

}int main()

; int m, n;

cin >> m >> n; //c(9,m) ;sum()=n

vectorinput(a,a+9);

vector> vecs;

vectorvec;

combination(input, 0, m, vec, vecs,n); ////c(n,m)

if (!flag)

return 0;

}#endif

#if 1

void printcombination(int *a, int n, int sum, vector& vec)

cout

sort(a,a+8);

cout<

copy(a, a + 8, ostream_iterator(cout, " "));

cout<

int sum=10;

cout<

求從n個陣列任意選取乙個元素的所有組合,對於這個問題,我們在直觀上感覺很容易,但是用程式實現時則發現用for迴圈解決不了問題,因為n是隨意的。

在這裡,我們用遞迴的思想,對於資料[1, 3, 4]; [2, 5]; [6, 7];

//函式功能 : 求解number次打中sum環的種數  

//函式引數 : number為打靶次數,sum為需要命中的環數,result用來儲存中間結果,total記錄種數

//返回值 : 無

void shootproblem_solution1(int number, int sum, vector&result, int *total)

else

return;

} for(unsigned i = 0; i <= 10; i++) //命中0-10環

}

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...

組合數的實現

求出從陣列a中取出n個元素的所有組合 includeusing namespace std int a 10 按索引從小到大 這裡的start是陣列頭部a 0 的下標0 void dfs1 int a,int start,int a len,int result,int count,int num ...

組合數的和

給定 n 個非 0 的個位數字,用其中任意 2 個數字都可以組合成 1 個 2 位的數字。要求所有可能組合出來的 2 位數字的和。例如給定 2 5 8,則可以組合出 25 28 52 58 82 85,它們的和為330。輸入在第一行中給出 n 1 n 10 隨後一行給出 n 個不同的非 0 個位數字...