题解 | #分割等和子集# 是否有解,只需要一维dp

分割等和子集

https://www.nowcoder.com/practice/65ade309fa4d4067a9add749721bfdc0

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n,t,sum=0;
    cin>>n;
    vector<int> nums;nums.reserve(n);
    //由于背包容量要最后才知道,这道题没有办不保存原数组
    while(n-- &&cin>>t){
        nums.push_back(t);
        sum+=t;
    }
    if(sum%2){
        cout<<"false"<<endl;//奇数,无解
        return 0;
    }
    sum/=2;
    vector<bool> dp(sum+1,false);
    int i,j,boundary,curMax=0;
    dp[0]=true;
    //只是判断是否有解,不需要用二维数组来dp

    for(i=0;i<nums.size();++i){
        boundary=min(sum-nums[i],curMax);
        for(j=boundary;j>=0;--j){
            
            if(dp[j]){
                dp[j+nums[i]]=true;
                curMax=max(j+nums[i],curMax);
                if(j+nums[i]==sum)break;
            }
        }
        
    }

    cout<<(dp[sum]?"true":"false")<<endl;

}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务