#yyds干货盘点# 动态规划专题:数位染色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# 动态规划专题:数位染色相关的知识,希望对你有一定的参考价值。

1.简述:

描述

小红拿到了一个正整数 #yyds干货盘点# 。她可以将其中一些数位染成红色。然后她想让所有染红的数位数字之和等于没染色的数位数字之和。她不知道能不能达成目标。你能告诉她吗?

输入描述:

一个正整数 #yyds干货盘点# ,#yyds干货盘点#

输出描述:

如果小红能按要求完成染色,输出"Yes"。否则输出"No"。

示例1

输入:

1234567

输出:

Yes

说明:

将3、4、7染成红色即可,这样3+4+7=1+2+5+6
示例2

输入:

23

输出:

No

说明:

显然无论如何都不能完成染色。

2.代码实现:


public class Main
public static void main(String[] args)
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) // 注意 while 处理多个 case
String str = in.next();
String res = process(str) ? "Yes" : "No";
System.out.println(res);



public static boolean process(String str)
if (str == null || str.length() < 1)
return false;

char[] arr = str.toCharArray();
int sum = 0;
int n = arr.length;
int[] nums = new int[n];
for (int i = 0; i < n; i++)
sum += (arr[i] - 0);
nums[i] = arr[i] - 0;

int half = sum / 2;
if (sum % 2 != 0)
return false;

boolean[] dp = new boolean[half + 1];
dp[0] = true;
dp[nums[0]] = true;
for (int i = 1; i < n; i++)
for (int j = half; j >= nums[i]; j--)
dp[j] = dp[j] || dp[j - nums[i]];

if (dp[half])
return true;


return false;




以上是关于#yyds干货盘点# 动态规划专题:数位染色的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# 动态规划专题:小红取数

#yyds干货盘点# 动态规划专题:装箱问题

#yyds干货盘点# 动态规划专题:跳跃游戏

#yyds干货盘点# 动态规划专题:不相邻取数

#yyds干货盘点# 动态规划专题:合唱队形

#yyds干货盘点# 动态规划专题:字母收集