题解 | #放苹果#
放苹果
https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); String a; try { a = r.readLine(); } catch (IOException e) { throw new RuntimeException(e); } // 有一个盘子为空!=>有多个盘子为空,反而,有多个盘子为空=>有一个盘子为空 // 有一个盘子为空的分法,包含进了有多个盘子为空的所有分法 // 换言之,求出了只有一个盘子为空的分法,这些分法里面就包括有多个盘子为空的情况 // 有一个盘子为空的反面是所有盘子里面都有苹果 // !(p1!=0 && p2!=0 && p3!=0 && p4!=0 && p5!=0 && p6!=0 && p7!=0)==(p1==0 || p2==0 || p3==0 || p4==0 || p5==0 || p6==0) // 上式中,等于运算符右侧表示至少有一个盘子是空的情况 char[] chs = a.toCharArray(); int i = 0, k = 0, l = chs.length, t = 0, m = 0, n = 0; while (i < l) { if (chs[i] == ' ') { if (k > 0) m = t; t = 0; k = 0; i++; continue; } k++; t *= 10; t += chs[i] - '0'; if (i == l - 1) n = t; i++; } System.out.print(getDiv(m, n)); } private static int getDiv(int m, int n) { if (n < 0 || m < 0) return 0; if (m == 1 || n == 1) return 1; return getDiv(m, n - 1) + getDiv(m - n, n); } }