题解 | #放苹果#**动态规划看不懂,我用递归整了一个
放苹果
https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static int m = 0;
static int n = 0;
static int count = 0;
static Set<String> set;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
m = in.nextInt();
n = in.nextInt();
count = 0;
set = new HashSet();
for (int i = m; i > 0; i--) {
int arr[] = new int[n];
dfs(i, 0, arr);
}
System.out.println(count);
// System.out.println(set);
}
}
private static void dfs(int num, int idx, int[] arr) {
if (idx == n) {
return;
}
arr[idx] = num;
if (idx >= 1 && arr[idx - 1] < arr[idx]) {
return;
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
if (sum == m) {
count++;
// System.out.println(Arrays.toString(arr));
set.add(Arrays.toString(arr));
return;
}
}
// for (int i = m - sum; i > 0; i--) {
for (int i = Math.min(m - sum, num); i > 0; i--) {
// if (i<4 && idx ==1) {
// System.out.printf("dfs to next: i= %d, idx=%d, arr=%s", i, idx + 1, Arrays.toString(arr));
// System.out.println();
// }
dfs(i, idx + 1, arr);
if (idx + 1 < n) {
arr[idx + 1] = 0;
}
}
}
}
