Để tìm tất cả các tập con có tổng bằng một giá trị cho trước trong JavaScript, bạn có thể sử dụng phương pháp đệ quy kết hợp với kỹ thuật backtracking. Phương pháp này sẽ kiểm tra tất cả các tổ hợp có thể của các phần tử trong mảng để tìm ra những tập con có tổng bằng giá trị cho trước.
Mã Nguồn:
function findSubsetsWithSum(nums, targetSum) {
let result = [];
function backtrack(start, currentSubset, currentSum) {
// Kiểm tra nếu tổng hiện tại bằng với targetSum
if (currentSum === targetSum) {
result.push([...currentSubset]);
return;
}
// Duyệt qua các phần tử bắt đầu từ vị trí hiện tại
for (let i = start; i < nums.length; i++) {
// Thêm phần tử hiện tại vào tập con và cập nhật tổng
currentSubset.push(nums[i]);
currentSum += nums[i];
// Gọi đệ quy để tiếp tục tìm kiếm
backtrack(i + 1, currentSubset, currentSum);
// Loại bỏ phần tử cuối cùng để backtrack
currentSubset.pop();
currentSum -= nums[i];
}
}
backtrack(0, [], 0);
return result;
}
// Ví dụ kiểm tra
console.log(findSubsetsWithSum([2, 3, 5, 7], 10));
// Output: [[3, 7], [2, 3, 5]]
Giải Thích:
-
Hàm Backtrack:
- Hàm
backtrack
được sử dụng để duyệt qua tất cả các tổ hợp của các phần tử trong mảng. - Tham số
start
đại diện cho vị trí bắt đầu của lần duyệt hiện tại. currentSubset
là mảng tạm thời lưu trữ các phần tử của tập con hiện tại.currentSum
là tổng của các phần tử trongcurrentSubset
.
- Hàm
-
Kiểm Tra Tổng Hiện Tại:
- Nếu
currentSum
bằng vớitargetSum
, thêm bản sao củacurrentSubset
vào mảngresult
.
- Nếu
-
Duyệt Qua Các Phần Tử:
- Vòng lặp
for
bắt đầu từstart
và duyệt qua tất cả các phần tử còn lại trong mảngnums
. - Thêm phần tử hiện tại vào
currentSubset
và cập nhậtcurrentSum
. - Gọi đệ quy để tiếp tục tìm kiếm từ vị trí tiếp theo (
i + 1
). - Sau khi đệ quy hoàn thành, loại bỏ phần tử cuối cùng khỏi
currentSubset
và trừ giá trị của nó khỏicurrentSum
để backtrack và thử các tổ hợp khác.
- Vòng lặp
Tổng Quan:
- Backtracking: Kỹ thuật mạnh mẽ để duyệt qua tất cả các tổ hợp và tìm kiếm tập con có tổng bằng giá trị cho trước.
- Độ Phức Tạp Thời Gian: O(2^n), do có thể có tới 2^n tập con từ một mảng có n phần tử.
- Ứng Dụng: Thích hợp cho các bài toán tổ hợp và tìm kiếm tập con trong các ngôn ngữ lập trình.
Ví Dụ Thực Tế:
console.log(findSubsetsWithSum([2, 3, 5, 7], 10));
// Output: [[3, 7], [2, 3, 5]]
console.log(findSubsetsWithSum([1, 2, 3, 4, 5], 5));
// Output: [[2, 3], [1, 4], [5]]
Trong ví dụ trên, mảng [2, 3, 5, 7]
có các tập con [3, 7]
và [2, 3, 5]
có tổng bằng 10, và mảng [1, 2, 3, 4, 5]
có các tập con [2, 3]
, [1, 4]
, và [5]
có tổng bằng 5.
Comments