<!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>