n 개의 수가 있 습 니 다. 그 중 모든 것 과 s 인 k 개의 조합 을 출력 합 니 다.
2023 단어 알고리즘 - 배열
예 를 들 어 n = 6 이 라 고 가정 하면 이 6 개 수 는 1, 2, 1, 3 의 모든 조합 을 요구 하면
제목 에 제한 조건 을 붙 였 습 니 다. 만약 에 k = 2 를 명령 하면 출력 만 요구 합 니 다. [{1, 2}, {0, 3}] 하면 됩 니 다.
#include
#include
#include
using namespace std;
#define SUM 20
#define SIZE 10
#define K 3
#define HASHSIZE 9
list mylist;
vector hashvector;
void initRandom(int* arr) {
srand(unsigned(time(0)));
for (int i = 0; i < SIZE; i++) {
arr[i] = rand() % 10;
}
for (int i = 0; i < SIZE; i++) {
cout << " " << arr[i];
}
cout << endl;
}
int getCurHash() {
int hash = 0;
for (list::iterator it = mylist.begin(); it != mylist.end(); ++it) {
hash |= (1 << *it);
}
return hash;
}
void sumOfkNum(int sum, int*arr, int i, bool &flag) {
if (sum <= 0 || i == SIZE) {
return;
}
if (sum == arr[i] && mylist.size() == K - 1) {
int hash = getCurHash() | (1 << arr[i]);
if (find(hashvector.begin(), hashvector.end(), hash)
== hashvector.end()) {
hashvector.push_back(hash);
for (list::iterator it = mylist.begin(); it != mylist.end();
++it) {
cout << *it << "+";
}
cout << arr[i] << endl;
} else {
return;
}
} else {
if (mylist.size() > K) {
return;
}
mylist.push_back(arr[i]);
sumOfkNum(sum - arr[i], arr, i + 1, flag);
mylist.pop_back();
sumOfkNum(sum, arr, i + 1, flag);
}
}
int main() {
int* arr = new int[SIZE];
bool flag = false;
initRandom(arr);
sumOfkNum(SUM, arr, 0, flag);
if (hashvector.empty()) {
cout << "no result" << endl;
}
return 0;
}