当前位置:首页 > JavaScript

js实现凑数

2026-04-06 05:19:44JavaScript

实现凑数算法的 JavaScript 方法

问题描述
凑数问题通常指从给定数组中找出若干元素,使它们的和等于或接近目标值。以下是几种常见的实现方式:

递归回溯法

适用于元素较少的情况,通过递归尝试所有可能的组合:

function findSubsetSum(nums, target) {
  const result = [];
  const backtrack = (start, path, sum) => {
    if (sum === target) result.push([...path]);
    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;
}

// 示例
const nums = [2, 4, 6, 8];
console.log(findSubsetSum(nums, 10)); // 输出 [[2,8], [4,6]]

动态规划法

适用于较大数据集,通过构建 DP 表记录可能达到的和:

function subsetSumDP(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];
}

// 示例
console.log(subsetSumDP([3, 5, 7], 10)); // 输出 true

近似凑数算法

当需要最接近目标值时,可使用贪心或动态规划优化:

js实现凑数

function closestSum(nums, target) {
  let closest = Infinity;
  nums.sort((a, b) => a - b);
  const dfs = (index, currentSum) => {
    if (Math.abs(currentSum - target) < Math.abs(closest - target)) {
      closest = currentSum;
    }
    for (let i = index; i < nums.length; i++) {
      if (currentSum + nums[i] > target) break; // 提前终止
      dfs(i + 1, currentSum + nums[i]);
    }
  };
  dfs(0, 0);
  return closest;
}

// 示例
console.log(closestSum([1, 2, 3, 4], 9)); // 输出 10

性能优化建议

  1. 排序剪枝:先对数组排序,可在递归中提前终止无效分支。
  2. 记忆化:使用缓存避免重复计算(如斐波那契数列中的优化)。
  3. 限制深度:对大规模数据设置递归深度限制或改用迭代。

实际应用场景

  • 财务预算分配
  • 游戏道具组合优化
  • 资源调度中的任务分配

以上方法可根据具体需求选择,递归法直观但性能有限,动态规划适合精确解,近似算法适用于模糊匹配场景。

标签: js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…