【问题标题】:Lucky Tickets (count an amount of lucky numbers, having the specified sum of ALL digits)幸运票(计算一定数量的幸运数字,所有数字的总和)
【发布时间】:2011-06-04 02:57:58
【问题描述】:
这里是problem
给您一个 1 ≤ N ≤ 50 的数字。每张票都有其 2N 位数字。如果票的前 N 位数字之和等于其最后 N 位数字之和,我们就称它为幸运票。您还将获得该号码中所有数字的总和。你的任务是计算一定数量的幸运数字,所有数字的总和都是指定的。
对于输入 2 2 输出为 4 (0101, 0110, 1001, 1010)
你能帮我解决这个问题吗?最小复杂度是多少?
【问题讨论】:
标签:
algorithm
dynamic-programming
【解决方案1】:
如果要求的总和是s,那么每一半必须有总和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 根据问题的限制,你需要一些很长的算术才能通过它。
【解决方案2】:
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;
}