当前位置:首页 > JavaScript

js实现凑数

2026-03-14 11:20:34JavaScript

凑数算法实现思路

凑数问题通常指从给定数组中选取若干元素,使其和等于或接近目标值。以下是几种常见实现方式:

js实现凑数

递归回溯法

适用于小规模数据,通过深度优先搜索尝试所有可能的组合:

js实现凑数

function findCombination(nums, target) {
  const result = [];

  function backtrack(start, path, sum) {
    if (sum === target) {
      result.push([...path]);
      return;
    }

    for (let i = start; i < nums.length; i++) {
      if (sum + nums[i] > target) continue;
      path.push(nums[i]);
      backtrack(i + 1, path, sum + nums[i]);
      path.pop();
    }
  }

  backtrack(0, [], 0);
  return result;
}

动态规划法

适用于较大数据量,记录可能达到的和值:

function subsetSum(nums, target) {
  const dp = Array(target + 1).fill(false);
  dp[0] = true;

  for (const num of nums) {
    for (let i = target; i >= num; i--) {
      dp[i] = dp[i] || dp[i - num];
    }
  }

  return dp[target];
}

近似算法

当需要快速找到近似解时,可采用贪心算法:

function approximateSum(nums, target) {
  nums.sort((a, b) => b - a);
  let sum = 0;
  const result = [];

  for (const num of nums) {
    if (sum + num <= target) {
      sum += num;
      result.push(num);
    }
  }

  return { sum, combination: result };
}

优化建议

  1. 大数据集考虑使用记忆化递归
  2. 需要所有解时保留回溯过程中的路径
  3. 允许近似解时可设置误差范围
  4. 负数处理需要额外条件判断

实际应用示例

const numbers = [3, 9, 8, 4, 5, 7];
const target = 15;

console.log('精确解:', findCombination(numbers, target));
console.log('是否存在解:', subsetSum(numbers, target));
console.log('近似解:', approximateSum(numbers, target));

以上方法可根据具体需求选择使用,递归法适合获取所有解,动态规划适合判断解是否存在,贪心算法适合快速获取近似解。

标签: js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…