C++ 等分子集和Leetcode:运行时错误 类解决方案{ 公众: 布尔子集(向量a,整数n,整数和){ bool-dp[n+1][sum+1]; int i,j; 对于(i=0;i

C++ 等分子集和Leetcode:运行时错误 类解决方案{ 公众: 布尔子集(向量a,整数n,整数和){ bool-dp[n+1][sum+1]; int i,j; 对于(i=0;i,c++,dynamic-programming,C++,Dynamic Programming,看代码,它必须是一个向量或数组边界错误。那么仔细看,我们看到了什么 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]

看代码,它必须是一个向量或数组边界错误。那么仔细看,我们看到了什么

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);
    }
}
};
(i=1;i
  • 这清楚地解释了这个问题

  • 所有的动态规划解决方案都已经解释过了

替代解决方案 由于最大数量和最大长度非常有限,我们还可以使用
std::bitset
来解决此问题(以及正确的变量命名):

//下面的块可能会稍微缩短执行时间;
//可以移除;
静态常数自动优化{
std::ios::与stdio同步(false);
标准:cin.tie(无PTR);
标准::cout.tie(无PTR);
返回0;
}();
//大多数标题已经包含在内;
//可以移除;
#包括
#包括
#包括
#定义最大数量100
#定义最大长度200
使用ValueType=std::int\u fast16\u t;
静态常数结构解{
静态常量布尔canPartition(std::vector和nums){
std::位集位(1);
ValueType总和=0;
用于(常量自动和数值:nums){
sum+=num;
位|=位>1];
}
};

工具书类
  • 有关更多详细信息,请参阅,您可以在其中找到大量解释良好的公认解决方案,包括低复杂度算法和渐近/分析

除了在代码中使用非标准VLA之外,您也没有初始化所有元素(您只是在初始化
dp[i][0]
,因此读取调用UBI的值之外的值很难理解
else i(j==0)
。也许
i==0
你知道向量,那么为什么要使用可变长度数组呢?它们都是非标准的,很容易导致堆栈溢出。考虑到你发布了一个完全不同的解决方案,这看起来非常像一个只链接的答案。这里唯一能直接回答这个问题的是你的第一个项目。请阅读。发布在这里,使用你自己的解决方案通常不合适;帮助人们学习如何解决问题,而不是展示你的代码也是如此。是的,答案应该对未来的读者有所帮助。但他们仍然必须回答这个问题。就我而言,这个答案并不能做到这一点。“如果没有帮助,这篇文章能做什么?”-转储代码并说“这完全不同的代码工作,阅读它并找出它”不是很有帮助。这里的另一个答案明确指出了OP代码的潜在问题,解释了问题,并指出了解决方案。这更合适。你是说标题明确指出这是一个运行时错误,OP在问题主体中共享了代码?好吧,这就是问题所在:帮助人们请学习,这通常意味着您需要做一些解释。如果您只是想展示自己的代码,请在其他地方进行。
for(i=1;i<=n;i++){
    ...
         dp[i][j]= dp[i-1][j] || dp[i-1][j-a[i]];
                                           ^^^^
// The following block might slightly improve the execution time;
// Can be removed;
static const auto __optimize__ = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
}();

// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <vector>
#include <bitset>

#define MAX_NUM 100
#define MAX_LEN 200

using ValueType = std::int_fast16_t;

static const struct Solution {
    static const bool canPartition(std::vector<int>& nums) {
        std::bitset<MAX_NUM * MAX_LEN / 2 + 1> bits(1);
        ValueType sum = 0;

        for (const auto& num : nums) {
            sum += num;
            bits |= bits << num;
        }

        return !(sum & 1) && bits[sum >> 1];
    }
};