import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
List<Integer> digits = new ArrayList<>();
int sum = 0;
for (char c : s.toCharArray()) {
int d = c - '0';
sum += d;
digits.add(d);
}
if (sum % 2 != 0) {
System.out.println("No");
return;
}
int target = sum / 2;
boolean[] dp = new boolean[target + 1];
dp[0] = true;
for (int d : digits) {
if (d > target) continue;
for (int j = target; j >= d; j--) {
if (dp[j - d]) {
dp[j] = true;
}
}
}
System.out.println(dp[target] ? "Yes" : "No");
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:将输入的正整数转换为字符串,并逐个字符处理,提取各个数位的数字并计算总和。
- 奇偶判断:如果总和是奇数,直接输出"No"。
- 动态规划初始化:创建一个布尔数组dp,dp[i]表示是否存在子集的和为i。初始化dp[0]为true。
- 动态规划过程:遍历每个数位数字,逆序更新dp数组,确保每个数字只能用一次。
- 结果判断:检查目标值是否可达,如果可达则输出"Yes",否则输出"No"。



京公网安备 11010502036488号