为什么还有人用VIM?
题目拆解
一个数组 values 表示不同面值,比如 [1, 2, 3]。 另一个数组 counts 表示对应面值的数量,比如 [2, 1, 3]。
思路分析
算法步骤
定义一个集合 results 用来存储所有可能的价格总和。 从第一个面值开始,使用 DFS 遍历所有可能的数量组合。 每次遍历到一个面值,尝试从 0 到该面值的最大数量(由 counts 决定)。 递归处理剩下的面值。 当遍历完成时,将总和加入 results。
代码实现
JavaScript:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>面值组合总和</title></head><body><h1>面值组合总和</h1><p>打开控制台查看结果</p><script>function allPossibleSums(values, counts) {let results = new Set();function dfs(index, currentSum) {if (index === values.length) {results.add(currentSum);return;}for (let i = 0; i <= counts[index]; i++) {dfs(index + 1, currentSum + values[index] * i);}}dfs(0, 0);return Array.from(results).sort((a, b) => a - b);}// 示例数据const values = [1, 2, 3];const counts = [2, 1, 3];// 调用函数并打印结果const result = allPossibleSums(values, counts);console.log(result);</script></body></html>
结果说明
python:
def all_possible_sums(values, counts):results = set()def dfs(index, current_sum):# 如果遍历完所有面值,添加当前总和到结果集if index == len(values):results.add(current_sum)return# 遍历当前面值的所有可能数量for i in range(counts[index] + 1):dfs(index + 1, current_sum + values[index] * i)# 从第一个面值开始dfs(0, 0)return sorted(results)# 示例数据values = [1, 2, 3]counts = [2, 1, 3]# 调用函数并打印结果result = all_possible_sums(values, counts)print(result)
代码解析
results 是一个集合,用来存储所有可能的总和。使用集合可以自动去重。 dfs 函数是核心递归函数,index 表示当前处理到的面值下标,current_sum 表示当前累计的总和。 在 dfs 函数中,先检查是否遍历完所有面值,如果是,就把当前总和加入结果集。 如果没有遍历完,就遍历当前面值的所有可能数量(从 0 到最大数量),递归处理下一个面值。 最后,通过调用 dfs(0, 0) 从第一个面值开始计算,返回结果集合并排序。
结果说明
目前,对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB。全部免费领取!全面满足各个阶段程序员的学习需求。