3

这是问题

给你一个 1 ≤ N ≤ 50 的数字。每张票都有其 2N 位数字。如果票的前 N ​​位数字之和等于其最后 N 位数字之和,我们称该票为幸运票。您还将获得该号码中所有数字的总和。你的任务是计算一定数量的幸运数字,所有数字的总和都是指定的。

对于输入 2 2 输出为 4 (0101, 0110, 1001, 1010)

你能帮我解决这个问题吗?最小复杂度是多少?

4

2 回答 2

4

如果要求 sum 是s,那么每一半都必须有 sum s/2。现在,您需要找到f(n, s/2):有多少个 n 位数字具有数字总和s/2。知道f(n, s/2)了,您可以在一行中得到答案(尝试自己弄清楚)。

至于如何计算f(n, m):这是标准的DP。你有递归公式,如f(n, m) = f(n-1, m) + f(n-1, m-1) + f(n-1, m-2) + ... + f(n-1, m-9). 在这里,0, 1, 2, .. 9是给定数字的最后一位数字的所有可能选项。如果最后一个数字是k,那么其余的是(n-1)-long 数字和数字之和m - k

希望能帮助到你。

PS根据问题限制,您需要某种长算术才能通过它。

于 2011-01-05T16:16:50.353 回答
0
private static boolean isLucky(int n) {

    int sum1 = 0;
    int sum2 =0;
    String s = String.valueOf(n);
    System.out.println("After Conversion in String= " + s);
    for (int i = 0; i < (s.length()) / 2; i++) {
        System.out.println("half string === " + s.charAt(i));
        sum1 = sum1 + Character.getNumericValue(s.charAt(i));
    }
    System.out.println("half sum === " + sum1);
    for(int j=(s.length()) / 2 ; j< s.length();j++){
        System.out.println("half string === " + s.charAt(j));
        sum2 = sum2 + Character.getNumericValue(s.charAt(j));
    }
    System.out.println("another half sum === " + sum2);
    if(sum1 == sum2){
        return true;
    }
    return false;
}
于 2019-05-28T13:05:35.287 回答