题解 | #分割等和子集#

分割等和子集

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

如果能分成相等的两份的话,那么sum一定是偶数

1.sum是奇数的话 就false

2.如果是偶数 就变成了0-1背包问题 求数组和是否有和为sum / 2的子数组 有就是true

3.没有就false

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

// 数组元素加和 100 * 500 = 50000 sum / 2是25000 所以要开大于25000
const int N = 25000;
int f[N], a[N], sum;

int main() {
    int n;
    cin >> n;

    for(int i = 1; i <= n; i ++){
        cin >> a[i];
        sum += a[i];
    }

    if(sum % 2 != 0) cout << "false" << endl;
    else{
        f[0] = 1;
        for(int i = 1; i <= n; i ++)
            for(int j = sum / 2; j >= a[i]; j --){
                f[j] = f[j] || f[j - a[i]];
            }
        if(f[sum / 2]) cout << "true" << endl;
        else cout << "false"<< endl;
    }

}

全部评论

相关推荐

斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务