#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 個位數字...