|
<!DOCTYPE html> <html> <head> <title>组合求和</title> <style> body { font-family: sans-serif; } .container { width: 500px; margin: 0 auto; padding: 20px; border: 1px solid #ccc; border-radius: 5px; } label { display: block; margin-bottom: 5px; } input[type="text"], input[type="number"] { width: 100%; padding: 8px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 3px; box-sizing: border-box; } button { padding: 10px 15px; background-color: #007bff; color: white; border: none; border-radius: 3px; cursor: pointer; } button:hover { background-color: #0056b3; } #result { margin-top: 20px; border: 1px solid #eee; padding: 10px; border-radius: 3px; background-color: #f9f9f9; white-space: pre-wrap; } </style> </head> <body> <div class="container"> <h1>组合求和</h1> <label for="numbers">数字序列 (用逗号分隔):</label> <input type="text" id="numbers" placeholder="例如: 36, 42, 48, 60"> <label for="target">目标总和:</label> <input type="number" id="target" placeholder="例如: 3302"> <label for="limit">结果数量限制:</label> <input type="number" id="limit" value="10" placeholder="例如: 10"> <button onclick="findCombinations()">查找组合</button> <div id="result"></div> </div> <script> function findCombinations() { const numbersInput = document.getElementById("numbers").value; const target = parseInt(document.getElementById("target").value); const limit = parseInt(document.getElementById("limit").value); const numbers = numbersInput.split(',').map(numStr => parseInt(numStr.trim())).filter(num => !isNaN(num)); const resultDiv = document.getElementById("result"); resultDiv.textContent = "正在查找..."; // JavaScript 实现的回溯算法 function backtrack(combination, remaining_target, start_index, result, count, limit) { if (count[0] >= limit) { return; } if (remaining_target === 0) { result.push([...combination]); // 添加组合的副本 count[0]++; return; } if (remaining_target < 0) { return; } for (let i = start_index; i < numbers.length; i++) { combination.push(numbers[i]); backtrack(combination, remaining_target - numbers[i], i + 1, result, count, limit); combination.pop(); // 回溯 } } const results = []; const count = [0]; backtrack([], target, 0, results, count, limit); if (results.length > 0) { resultDiv.textContent = `找到以下 ${results.length} 组总和等于 ${target} 的组合:\n${results.map(arr => "[" + arr.join(", ") + "]").join("\n")}`; } else { resultDiv.textContent = `没有找到总和等于 ${target} 的组合。`; } } </script> </body> </html> |