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

Perfect Sum子集和计数问题代码运行异常调试方法咨询

代码存在的问题
  • 边界条件错误,未考虑数组包含0的场景:当前代码只要sum==0就直接返回1,忽略了剩余数组元素中存在0时,选或不选0都能满足sum=0的情况,会导致统计数少算。比如输入arr=[0],n=1,sum=0,正确返回值是2(空集、选0),你的代码只会返回1。
  • 备忘录数组类型不匹配:你的t数组是vector<vector<int>>类型,但递归返回值是long long,赋值时会发生整型截断,导致存储的中间结果错误。
  • 取模逻辑错误:首先pow(10,9)+7是浮点数运算,存在精度误差,应该直接使用整型常量1000000007;其次取模仅在最后执行,中间递归相加时数值已经超出整型范围发生溢出,应该每一步相加后都执行取模操作。
  • 返回值溢出风险:递归中两个结果相加时没有做溢出防护,即使是long long也可能在多次累加后溢出,配合每步取模可以避免该问题。
修复后的参考代码
const int MOD = 1000000007;
class Solution{
    private:
    vector<vector<long long>> t;
    public:
    Solution() {
        t.resize(1001, vector<long long> (1001,-1));
    }
    int perfectSum(int arr[], int n, int sum)
    {  
        return sumrecursive(arr, n, sum) % MOD;
    }
    
    long long sumrecursive(int arr[], int n, int sum){
        if(n==0){
            return sum == 0 ? 1 : 0;
        }
        if(t[n][sum] != -1){
            return t[n][sum];
        }
        if(arr[n-1]>sum){
            return t[n][sum] = sumrecursive(arr, n-1, sum) % MOD;
        } else {
            return t[n][sum] = (sumrecursive(arr,n-1, sum-arr[n-1]) + sumrecursive(arr, n-1, sum)) % MOD;
        }
    }
};
调试定位建议
  • 优先构造边界测试用例验证:比如包含0的小数组、sum=0的场景、数组全为0的场景,先验证小输入下的输出是否符合预期,再排查大规模输入的问题。
  • 可以在递归函数入口打印n、sum、当前返回值的日志,对比预期的递归路径和实际执行路径的差异,快速定位到逻辑错误的分支。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:57:02