当前位置:首页 > 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实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js轮播图实现原理

js轮播图实现原理

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

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…