You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将JavaScript实现的动态规划howSum函数转换为C++代码的咨询

实现思路

  • 对应JS中可以返回数组或null的特性,C++使用std::optional<std::vector<int>>作为返回类型:存在可行解时返回存储了数字组合的std::vector<int>,无可行解时返回std::nullopt对应原逻辑的null,目标和为0时返回空std::vector<int>完全匹配原逻辑。
  • 不需要使用C风格的数组指针和realloc,std::vector会自动管理内存,插入元素直接调用push_back或用初始化列表拼接即可,和JS的展开运算符逻辑等价。
  • memo参数不建议用静态默认值(会导致多次调用函数时缓存残留),你现在用函数重载的方式实现对外隐藏memo参数的效果是最优方案。

完整实现代码

#include <vector>
#include <unordered_map>
#include <optional>

// 内部递归实现,接收memo引用
std::optional<std::vector<int>> howSum(int targetSum, const std::vector<int>& numbers, std::unordered_map<int, std::optional<std::vector<int>>>& memo) {
    // 命中缓存直接返回
    if (memo.count(targetSum)) {
        return memo[targetSum];
    }
    // 基础条件
    if (targetSum == 0) {
        return std::vector<int>{};
    }
    if (targetSum < 0) {
        return std::nullopt;
    }

    for (int num : numbers) {
        auto res = howSum(targetSum - num, numbers, memo);
        if (res.has_value()) {
            // 拼接当前数字,存入缓存
            res->push_back(num);
            memo[targetSum] = res;
            return res;
        }
    }

    // 无可行解,存入缓存
    memo[targetSum] = std::nullopt;
    return std::nullopt;
}

// 对外暴露的接口,自动创建memo
std::optional<std::vector<int>> howSum(int targetSum, const std::vector<int>& numbers) {
    std::unordered_map<int, std::optional<std::vector<int>>> memo;
    return howSum(targetSum, numbers, memo);
}

兼容低版本C++的替代方案

如果你的编译环境不支持C++17的std::optional,可以改用std::pair<bool, std::vector<int>>作为返回类型:第一个元素为true表示存在可行解,第二个元素存储组合;第一个元素为false对应原逻辑的null。

使用示例

#include <iostream>

int main() {
    auto res = howSum(7, {2, 3});
    if (res.has_value()) {
        for (int n : res.value()) {
            std::cout << n << " ";
        }
        // 输出 3 2 (顺序和JS实现一致,为递归回溯时拼接的数字)
    } else {
        std::cout << "无可行解";
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者VerilogCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 02:57:00