题目的链接在这里:https://www.nowcoder.com/practice/adf828f399de4932955734a4eac12757
题目大意
小红拿到了一个正整数 X 。她可以将其中一些数位染成红色。然后她想让所有染红的数位数字之和等于没染色的数位数字之和。 她不知道能不能达成目标。你能告诉她吗?一、示意图
二、解题思路
数位dp
数位dp
代码如下:
import java.util.*;
public class Main{
static long sum=0;
final static long i=0;
static int flag=0;
public static void main(String args[]){
/**
* 数位染色 正整数x 把其中一些染成红色 把所有染红的数位之和等于没染红的数位数字之和
*/
Scanner sc=new Scanner(System.in);
long num=sc.nextLong();
long temp=num;
while (temp>0){
sum+=(temp%10);
temp/=10;
}
//这样sum就是全部的和了 然后开始递归
dfs(num,i);
//然后判断flag
if(flag==1){
System.out.println("Yes");
}
else{
System.out.println("No");
}
}
private static void dfs(long num, long temp) {
//递归判断 一旦出现temp大于等于sum的一半 或者num等于0
if(num==0||temp*2>=sum){
if(temp*2==sum){
//说明刚好
flag=1;
return;
}
return;
}
//没满足条件 就进行修改 也就是0 1背包 问题 选这个位置还是不选
//不选
dfs(num/10,temp);
//选
dfs(num/10,temp+(num%10));
}
}