这是问题
给你一个 1 ≤ N ≤ 50 的数字。每张票都有其 2N 位数字。如果票的前 N 位数字之和等于其最后 N 位数字之和,我们称该票为幸运票。您还将获得该号码中所有数字的总和。你的任务是计算一定数量的幸运数字,所有数字的总和都是指定的。
对于输入 2 2 输出为 4 (0101, 0110, 1001, 1010)
你能帮我解决这个问题吗?最小复杂度是多少?
这是问题
给你一个 1 ≤ N ≤ 50 的数字。每张票都有其 2N 位数字。如果票的前 N 位数字之和等于其最后 N 位数字之和,我们称该票为幸运票。您还将获得该号码中所有数字的总和。你的任务是计算一定数量的幸运数字,所有数字的总和都是指定的。
对于输入 2 2 输出为 4 (0101, 0110, 1001, 1010)
你能帮我解决这个问题吗?最小复杂度是多少?
如果要求 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根据问题限制,您需要某种长算术才能通过它。
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;
}