http://poj.org/problem?id=1564
该题运用DFS但是要注意去重,不能输出重复的答案
两种去重方式代码中有标出
第一种if(a[i]!=a[i-1])意思是如果这个数a[i]和上一个数相同,那么记录数组的同一个位置就没有必要再放入这个数。例如:4 3 3 2构成和是7,b数组的第二个位置放了3,则后面的那个3就没有必要再放入记录数组的第二个位置了。(可能会放到后面的位置)...
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<vector> #include<algorithm> #define N 110 using namespace std; int a[N], b[N]; int t, n, f; int cmp(const void *a, const void *b) { return *(int *)b - *(int *)a; } void DFS(int k, int j, int sum) { int i; if(sum == t) { f = 1; qsort(b, j, sizeof(b[0]), cmp); printf("%d", b[0]); for(i = 1 ; i < j ; i++) printf("+%d", b[i]); printf("\n"); return ; } for(i = k ; i < n ; i++) { if(a[i] != a[i - 1] || i == k) { b[j] = a[i]; DFS(i + 1, j + 1, sum + a[i]); } /*if(sum + a[i] <= t) { b[j] = a[i]; DFS(i + 1, j + 1, sum + a[i]); while(a[i] == a[i + 1] && i + 1 < n) i++;//去重 }*/ } } int main() { int i; while(scanf("%d%d", &t, &n), t + n) { f = 0; for(i = 0 ; i < n ; i++) scanf("%d", &a[i]); qsort(a, n, sizeof(a[0]), cmp); printf("Sums of %d:\n", t); DFS(0, 0, 0); if(f == 0) printf("NONE\n"); } return 0; }
时间: 2024-10-27 12:45:46