刷题记录:lc416分割等和子集

日期:2025-05-07

题型:01背包
难度:中等

题目大意

给出一个数组,判断是否能分成两个子集,和相同

力扣题目截图

解题思路

AC 代码


#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    while (cin >> n) {
        vector<int> nums(n);
        int sum = 0;
        for (int i = 0; i < n; i++) {
            cin >> nums[i];
            sum += nums[i];
        }

        if (sum % 2 != 0) {//如果总和是奇数,直接不可能平分
            cout << "false" << endl;
            continue;
        }

        int target = sum / 2;
        vector<int> dp(target + 1, 0);
        for (int i = 0; i < n; i++) {
            for (int j = target; j >= nums[i]; j--) { 
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);//dp[j]表示容量为j的背包最多能装多大价值的物品
            }
        }

        if (dp[target] == target) {//判断是否装满
            cout << "true" << endl;
        } else {
            cout << "false" << endl;
        }
    }
    return 0;
}

今日总结


← 返回我的学习主页