有K种颜色的小球(K<=10),每种小球有若干个,总数小于100个。
现在有一个小盒子,能放N个小球(N<=8),现在要从这些小球里挑出N个小球,放满盒子。
想知道有哪些挑选方式。注:每种颜色的小球之间没有差别。
请按数字递增顺序输出挑选小球的所有方式。
如有3种颜色,每种颜色小球的个数分别为a:1,b:2,c:3,挑出3个小球的挑法有:
003,012,021,102,111,120
题目链接
- 递归 每种小球分别取0~max值
这种方法还是很直观的 但是运行超时 只能通过80的case
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
private static List<Integer> path = new ArrayList<>();
public static void print(List<Integer> l) {
l.forEach(u -> System.out.print(u));
System.out.println("");
}
public static void run(int[] colors, int k, int n, int level) {
if (n == 0) {
if (level == k) {
print(path);
} else {
path.add(0);
run(colors, k, n, level + 1);
path.remove(path.size() - 1);
}
return;
}
if (level >= k) {
return;
}
for (int i = 0; i <= colors[level]; i++) {
path.add(i);
run(colors, k, n - i, level + 1);
path.remove(path.size() - 1);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int k = scanner.nextInt();
int n = scanner.nextInt();
int[] colors = new int[k];
for (int i = 0; i < k; i++) {
colors[i] = scanner.nextInt();
}
run(colors, k, n, 0);
}
}
}
2 递归改为for循环可以通过
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main {
private static List<Integer> path = new ArrayList<>();
public static void print(List<Integer> l, int k) {
StringBuilder sb = new StringBuilder();
l.forEach(u -> sb.append(u));
for (int i = l.size(); i < k; i++) {
sb.append(0);
}
System.out.println(sb.toString());
}
public static void run(int[] colors, int k, int n, int level) {
if (n == 0) {
print(path, k);
return;
}
if (level >= k) {
return;
}
for (int i = 0; i <= colors[level]; i++) {
path.add(i);
run(colors, k, n - i, level + 1);
path.remove(path.size() - 1);
}
}
private static List<List<Integer>> turn1 = new ArrayList<>();
public static void run_2(int[] colors, int k, int n, int level) {
if (k == 1) {
System.out.println(n);
return;
}
for (int i = 0; i <= colors[0]; i++) {
turn1.add(Arrays.asList(i));
}
List<Integer> temp;
for (int i = 1; i < k; i++) {
List<List<Integer>> lastTurn = turn1;
List<List<Integer>> nowTurn = new ArrayList<>();
for (int j = 0; j < lastTurn.size(); j++) {
for (int z = 0; z <= colors[i]; z++) {
temp = new ArrayList<>();
temp.addAll(lastTurn.get(j));
temp.add(z);
if (i == k-1) {
if (temp.stream().reduce(0, (u1, u2)->u1 + u2) == n) {
print(temp, k);
}
} else {
if (temp.stream().reduce(0, (u1, u2)->u1 + u2) <= n) {
nowTurn.add(temp);
}
}
}
}
turn1 = nowTurn;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int k = scanner.nextInt();
int n = scanner.nextInt();
int[] colors = new int[k];
for (int i = 0; i < k; i++) {
colors[i] = scanner.nextInt();
}
run_2(colors, k, n, 0);
}
}
}