首页 > 试题广场 >

神奇数

[编程题]神奇数
  • 热度指数:89 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和等于另一组数字的和,我们就将这个数称为神奇数。例如242就是一个神奇数,我们能够将这个数的数字分成两组,分别是{2,2}以及{4},而且这两组数的和都是4.东东现在需要统计给定区间中有多少个神奇数,即给定区间[l, r],统计这个区间中有多少个神奇数,请你来帮助他。

输入描述:
输入包括一行,一行中两个整数l和r(1 ≤ l, r ≤ 10^9, 0 ≤ r - l ≤ 10^6),以空格分割


输出描述:
输出一个整数,即区间内的神奇数个数
示例1

输入

1 50

输出

4
import java.util.*;

public class Main {
    // 求从给定区间里找神奇数
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int cnt = 0;
        int l = in.nextInt(), r = in.nextInt();
        for (int i = l; i <= r; i++) {
            if (fun(i)) {
                cnt++;
            }
        }
        System.out.println(cnt);
    }
    // 动态规划处理
    public static boolean fun(int n) {
        int[] arr = new int[(n+"").length()];
        int idx = 0;
        int sum = 0;
        while (n != 0) {
            arr[idx] = n % 10; // 数字按顺序放在数组里
            sum += arr[idx];
            idx++;
            n /= 10;
        }
        // 子集背包问题-转为0-1背包问题-> 224能不能凑出4问题
        if (sum % 2 != 0) return false;
        int amount = sum / 2;
        boolean[] dp = new boolean[amount+1];
        dp[0] = true;
        for (int num : arr) {
            for (int j = amount; j >= num; j--) {
                dp[j] = dp[j] || dp[j - num];
            }
        }
        return dp[amount];
    }
}
发表于 2022-08-20 16:20:29 回复(0)