import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = in.nextInt(); } int sum = 0; for (int num : nums) { sum += num; } if (sum % 2 != 0) { System.out.println("false"); return; } int target = sum / 2; boolean[] dp = new boolean[target + 1]; dp[0] = true; for (int num : nums) { for (int j = target; j >= num; j--) { if (dp[j - num]) { dp[j] = true; } } } System.out.println(dp[target]); } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取输入的数组长度和数组元素。
- 总和计算:计算数组的总和,并检查是否为奇数。如果是奇数,直接输出 false。
- 动态规划初始化:创建一个布尔数组 dp,大小为 target + 1,并初始化 dp[0] 为 true。
- 更新动态规划数组:遍历每个元素,反向更新 dp 数组,确保每个元素只被使用一次。
- 结果输出:检查 dp[target] 的值,如果为 true 则存在符合条件的子集,否则不存在。