NC18 数位染色
描述:
小红拿到了一个正整数 。她可以将其中一些数位染成红色。然后她想让所有染红的数位数字之和等于没染色的数位数字之和。
她不知道能不能达成目标。你能告诉她吗?
示例
输入:
1234567
输出:
Yes
说明:将3、4、7染成红色即可,这样3+4+7=1+2+5+6
思路:
很明显如果所有数字之和加起来为一个奇数,肯定无法达成目标,因为一个奇数无法被2整除。所以我们需要一个偶数。
得到一个偶数之后,我们需要在数组中找到n个数使他的和为sum/2,问题简化成一个0、1背包问题。
代码
nums = list(map(int, list(input())))
nums_sum = sum(nums)
if nums_sum & 1:
ans = 'No'
else:
target = nums_sum//2
dp = [False]*((nums_sum//2)+1)
dp[0] = True
for i in nums:
for j in range(nums_sum//2,i-1,-1):
dp[j] |= dp[j-i]
ans = 'Yes' if dp[-1] else 'No'
print(ans)
```