http://zerojudge.tw/ShowProblem?problemid=d653
這題要用到剪枝,一個情況是,在同一狀態下別選擇用過的數字,另一個情況則是,如果剩下的數字全選的話都還不夠,那就別再遞迴會下去了,因為根本不可能是答案。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n, m; int num[100], ans[100]; void DFS(int now, int index) { if(now == m) { for(int i = 0; i < m; i ++) printf("%d ", ans[i]); printf("\n"); return; } int last = -1; for(int i = index; i < n; i ++) { if(n - index < m - now) return; if(num[i] != last) { last = num[i]; ans[now] = num[i]; DFS(now + 1, i + 1); } } } int main() { while(scanf("%d %d", &n, &m) == 2) { if(n == 0 && m == 0) break; for(int i = 0; i < n; i ++) scanf("%d", &num[i]); sort(num, num + n); DFS(0, 0); } return 0; }