Trong bài toán này, chúng ta được cho một mảng N số nguyên và một số K. Nhiệm vụ là in tất cả các số riêng biệt có thể tạo bằng cách cộng bất kỳ K phần tử nào từ mảng. Khi chọn, một số có thể được lặp lại K lần.
Ví dụ để hiểu vấn đề:
Đầu vào: mảng = {2, 5, 13, 9}, K = 2
Đầu ra: 4, 7, 10, 11, 14, 15, 18, 22, 26
Giải thích: Cộng 2 phần tử: 2+2=4, 2+5=7, 2+13=15, 2+9=11, 5+5=10, 5+13=18, 5+9=14, 13+13=26, 13+9=22, 9+9=18
Để giải quyết, ta tìm tất cả tổ hợp K phần tử từ mảng. Sử dụng đệ quy để sinh các số. Để tránh trùng lặp, lưu các số vào set.
Ví Dụ
Mã minh họa giải pháp:
#include <bits/stdc++.h>
using namespace std;
set<int> distNumbers;
void generateNumberFromArray(int count, int arr[], int n, int num, int k) {
if (k == count) {
distNumbers.insert(num);
return;
}
for (int i = 0; i < n; i++) {
generateNumberFromArray(count + 1, arr, n, num + arr[i], k);
}
}
void printDistinctIntegers(int k, int arr[], int n) {
generateNumberFromArray(0, arr, n, 0, k);
cout << "Số " << distNumbers.size() << " số nguyên riêng biệt là:\n";
while (!distNumbers.empty()) {
cout << *distNumbers.begin() << "\t";
distNumbers.erase(distNumbers.begin());
}
}
int main() {
int arr[] = { 2, 5, 13, 9 };
int n = 4;
int k = 2;
printDistinctIntegers(k, arr, n);
return 0;
}
Đầu Ra
Số 9 số nguyên riêng biệt là: 4 7 10 11 14 15 18 22 26