首页 > 解决方案 > 分区相等子集和 Leetcode : RUNTIME ERROR

问题描述

class Solution {
public:

bool subsetSum(vector<int> a,int n,int sum){
    bool dp[n+1][sum+1];
    int i,j;
    for(i=0;i<=n;i++){
        for(j=0;j<=sum;j++){
            if(j==0){
                dp[i][j]=true;
            }
            else if(j==0){
                dp[i][j]=false;
            }
        }
    }
    for(i=1;i<=n;i++){
        for(j=1;j<=sum;j++){
            if(j < a[i-1]){
                dp[i][j]= dp[i-1][j];
            }
            else{
                dp[i][j]= dp[i-1][j] || dp[i-1][j-a[i]];
            }
        }
    }
    return dp[n][sum];
}

bool canPartition(vector<int>& nums) {
    int i,n=nums.size();
    int sum=0;
    for(i=0;i<n;i++){
        sum+=nums[i];
    }
    if(sum%2!=0){
        return false;
    }
    else{
        return subsetSum(nums,n,sum/2);
    }
}
};

我们必须返回 TRUE 或 FALSE,是否可以将给定的数组分成 2 部分,但总和必须相同(大小可能会有所不同)。UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:32:45 收到此错误,请帮忙。

标签: c++dynamic-programming

解决方案


查看代码,它必须是向量或数组边界错误。那么仔细观察我们会看到什么?

for(i=1;i<=n;i++){
    ...
         dp[i][j]= dp[i-1][j] || dp[i-1][j-a[i]];
                                           ^^^^

a有大小n,因此,当i等于时na[i]是一个向量越界错误。

能够清楚地看到您编写的代码对于程序员来说是一项有用的技能。在查看您自己的代码时尽量保持客观,尝试放弃您的假设。


推荐阅读