n 개의 수가 있 습 니 다. 그 중 모든 것 과 s 인 k 개의 조합 을 출력 합 니 다.

2023 단어 알고리즘 - 배열
분석: 이 문 제 는 두 개의 구덩이 가 있 습 니 다. 하 나 는 여기 의 n 개 수 는 임의로 정 해진 것 입 니 다. 꼭 1, 2, 3. n 이 아니 기 때문에 중복 되 는 수가 있 을 수 있 습 니 다 (중복 되 는 수가 있 으 면 어떻게 처리 합 니까?).둘째, 모든 것 과 s 를 위 한 모든 조합 을 출력 하 라 고 요구 하지 않 고 출력 과 s 를 위 한 k 개의 조합 만 요구 합 니 다.
예 를 들 어 n = 6 이 라 고 가정 하면 이 6 개 수 는 1, 2, 1, 3 의 모든 조합 을 요구 하면
  • 1 2
  • 1 2 0
  • 0 3
  • 1 1 1
  • 1 1 1 0

  • 제목 에 제한 조건 을 붙 였 습 니 다. 만약 에 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;
    }

    좋은 웹페이지 즐겨찾기