将写有数字的n个纸片放入一个纸箱子中,然后你和你的朋友从纸箱子中抽取4张纸片,每次记下纸片上的数字后放回子箱子中,如果这4个数字的和是m,代表你赢,否则就是你的朋友赢。
请编写一个程序,当纸片上所写的数字是k1,k2,k3,k4,..,kn时,是否存在抽取4次和为m的方案,如果存在,输出YES;否则,输出NO。
限制条件:
- 1 <= n <= 50
- 1 <= m <= 10^8
- 1 <= ki <= 10^8
#define N 5 #define M 10 set<int> s; int myCmp(const void *a, const void *b) { return *(int*) a - *(int*) b; } void initRandom(int* arr) { srand(unsigned(time(0))); for (int i = 0; i < N; i++) { arr[i] = rand() % 10; } qsort(arr, N, sizeof(int), myCmp); } void initSumSet(int* arr) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { s.insert(arr[i] + arr[j]); } } } int binaryFind(int* arr, int find) { if (!arr) { return -1; } int low = 0; int high = N - 1; int mid = (low + high) / 2; while (low <= high) { if (find < arr[mid]) { high = mid - 1; } else if (find > arr[mid]) { low = mid + 1; } else if (find == arr[mid]) { return mid; } mid = (low + high) / 2; } return -1; } void findFourNum2Sum(int* arr) { for (int i = 0; i < N; i++) { if (i > 0 && arr[i - 1] == arr[i]) { continue; } for (int j = 0; j < N; j++) { if (j > 0 && arr[j - 1] == arr[j]) { continue; } for (int k = 0; k < N; k++) { if (k > 0 && arr[k - 1] == arr[k]) { continue; } int id = -1; if ((id = binaryFind(arr, M - (arr[i] + arr[j] + arr[k]))) != -1) { cout << arr[i] << "+" << arr[j] << "+" << arr[k] << "+" << arr[id] << endl; } } } } } int find2NumEqToSum(int* arr, int sum, int index1, int index2) { int flag = 0; int begin = 0; int end = N - 1; while (begin < end) { if (arr[begin] + arr[end] < sum) { begin++; } else if (arr[begin] + arr[end] > sum) { end--; } else { flag = 1; cout << arr[index1] << "+" << arr[index2] << "+" << arr[begin] << "+" << arr[end] << endl; begin++; end--; while (arr[begin] == arr[begin - 1]) { begin++; } while (arr[end] == arr[end - 1]) { end--; } } } return flag; } void findFourNum2Sum1(int* arr) { for (int i = 0; i < N; i++) { if (i > 0 && arr[i - 1] == arr[i]) { continue; } for (int j = 0; j < N; j++) { if (j > 0 && arr[j - 1] == arr[j]) { continue; } set<int>::iterator it = s.find(M - arr[i] - arr[j]); if (it != s.end()) { find2NumEqToSum(arr, M - arr[i] - arr[j], i, j); } } } }