登 录
1. 增量构造
#include <iostream> using namespace std; #define N 1001 int rcd[N]; int used[N]; int num[N]; int n; void subset(int l) { for(int i = 0; i < l; i++) { cout << rcd[i] << " "; } cout << endl; int s = l ? rcd[l-1]+1 : 0; for(int i = s; i < n; i++) { rcd[l] = i; subset(l + 1); } } int readData() { int i; if( scanf("%d", &n) == EOF) { return 0; } for(int i = 0; i < n; i++) scanf("%d", &num[i]); for(int i = 0; i < n; i++) used[i] = 0; return 1; } int main() { while(readData()) { subset(0); } }
2. 位向量法
#include <iostream> using namespace std; #define N 1001 int rcd[N]; int used[N]; int num[N]; int n; void subset(int l) { if(l == n) { for(int i = 0; i < n; i++) { if(used[i]) { cout << num[i] << " "; } } cout << endl; } else { used[l] = 1; subset(l + 1); used[l] = 0; subset(l + 1); } } int readData() { int i; if( scanf("%d", &n) == EOF) { return 0; } for(int i = 0; i < n; i++) scanf("%d", &num[i]); for(int i = 0; i < n; i++) used[i] = 0; return 1; } int main() { while(readData()) { subset(0); } }
3. 一般组合
#include <iostream> using namespace std; #define N 1001 int rcd[N]; int num[N]; int n; int m; void selectCombination(int l, int p) { if(l == m) { for(int i = 0; i < m; i++) { cout << rcd[i] << " "; } cout << endl; } else { for(int i = p; i < n; i++) { rcd[l] = num[i]; selectCombination(l+1, i+1); } } } int readData() { int i; if( scanf("%d%d", &n, &m) == EOF) { return 0; } for(int i = 0; i < n; i++) scanf("%d", &num[i]); return 1; } int main() { while(readData()) { selectCombination(0, 0); } }
4. 全组合
#include <iostream> using namespace std; #define N 1001 int rcd[N]; int num[N]; int n; void fullCombination(int l, int p) { for(int i = 0; i < l; i++) { cout << rcd[i] << " "; } cout << endl; for(int i = p; i < n; i++) { rcd[l] = num[i]; fullCombination(l+1, i+1); } } int readData() { int i; if( scanf("%d", &n) == EOF) { return 0; } for(int i = 0; i < n; i++) scanf("%d", &num[i]); return 1; } int main() { while(readData()) { fullCombination(0, 0); } }
5. 去除重复组合
#include <iostream> using namespace std; #define N 1001 int rcd[N]; int num[N]; int used[N]; int n; int m; void unrepeatFullCombination(int l, int p) { for(int i = 0; i < l; i++) { cout << rcd[i] << " "; } cout << endl; for(int i = p; i < m; i++) { if(used[i] > 0) { used[i]--; rcd[l] = num[i]; unrepeatFullCombination(l+1, i); used[i]++; } } } int readData() { int i, j; if( scanf("%d", &n) == EOF) { return 0; } int val; for(i = 0; i < n; i++) { scanf("%d", &val); for(j = 0; j < m; j++) { if(num[j] == val) { used[j]++; break; } } if(j == m) { num[m] = val; used[m++] = 1; } } return 1; } int main() { while(readData()) { unrepeatFullCombination(0, 0); } }
测试结果:
/home/a/j/nomad2:cat input |./a.out 1 1 1 1 1 3 1 3 3
抱歉!评论已关闭.