【问题标题】: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)

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

【问题讨论】:

  • 这个问题在 2011 年秋季伯克利编程竞赛中也作为问题 #2 出现。整个问题集可以在这里找到:f2011-contest.pdf.

标签: 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 2017-04-01
      相关资源
      最近更新 更多