【发布时间】:2020-06-19 15:57:46
【问题描述】:
给定:
- 一套颜色独特的蜡笔(x 号)。
- 一组孩子。
- 所有蜡笔都必须分配给孩子们。
- 一个孩子可能有零到 x 支蜡笔。
- 每支蜡笔最终应该正好有 1 个孩子。蜡笔不能分配给 2 个或更多孩子。
如何找到所有可能的作业组合?
例如:
class Crayon {
String color;
public Crayon(String color) {
this.color = color;
}
public String getColor() {
return color;
}
@Override
public String toString() {
return color;
}
}
class Child {
String name;
Set<Crayon> crayons;
public Child(String name) {
this.name = name;
crayons = new HashSet<Crayon>();
}
public void addCrayon(Crayon crayon) {
crayons.add(crayon);
}
public Set<Crayon> getCrayons() {
return crayons;
}
@Override
public String toString() {
return "Child [name=" + name + ", crayons=" + crayons + "]";
}
}
public class DistributeCrayons {
public static void main(String[] args) {
Set<Crayon> crayons = new HashSet<>();
crayons.add(new Crayon("red"));
crayons.add(new Crayon("blue"));
crayons.add(new Crayon("green"));
crayons.add(new Crayon("orange"));
crayons.add(new Crayon("brown"));
crayons.add(new Crayon("yellow"));
crayons.add(new Crayon("purple"));
Child bob = new Child("bob");
Child amy = new Child("amy");
Child tom = new Child("tom");
for(??) {
for(??) {
??
System.out.println(bob +" "+ amy +" "+ tom);
??
}
}
}
}
这应该输出所有可能的赋值组合,例如:
孩子 [name=bob, crayons=[green, blue]] 孩子 [name=amy, crayons=[brown, red]] 孩子 [name=tom, crayons=[yellow, Purple, orange]]
孩子 [name=bob, crayons=[]] 孩子 [name=amy, crayons=[brown, red, blue]] 孩子 [name=tom, crayons=[yellow, Purple, orange, green]]
孩子 [name=bob, crayons=[red]] 孩子 [name=amy, crayons=[brown, green, Purple, orange]] 孩子 [name=tom, crayons=[blue, yellow]]
等等
更新
感谢大家的宝贵反馈,并感谢 גלעד ברקן 提供有效的 js 解决方案。 (抱歉,由于声誉原因,我无法投票或接受答案)。
我现在可以理解它了,这是我的解决方案版本:
我将蜡笔和儿童转换为列表而不是集合。 对于 7 支蜡笔(红色、蓝色、绿色、橙色、棕色、黄色、紫色)的列表,我的目标是生成三个孩子 bob (id="b")、amy (id="a ") 和 tom (id="t") 的 7 个字符形式。 例如:像“tbbbtat”这样的词表示 Tom 得到红色、棕色和紫色的蜡笔,bob 得到蓝色、绿色和橙色蜡笔,艾米得到黄色的。
public class DistributeCrayons {
public static void main(String[] args) {
List<Crayon> crayons = new ArrayList<>();
crayons.add(new Crayon("red"));
crayons.add(new Crayon("blue"));
crayons.add(new Crayon("green"));
crayons.add(new Crayon("orange"));
crayons.add(new Crayon("brown"));
crayons.add(new Crayon("yellow"));
crayons.add(new Crayon("purple"));
List<Child> children = new ArrayList<>();
children.add(new Child("b"));
children.add(new Child("a"));
children.add(new Child("t"));
List<String> assignments = null;
for(int i = 0; i < crayons.size(); i++)
assignments = addCrayonCombos(assignments, children);
System.out.println(assignments);
}
static List<String> addCrayonCombos(List<String> assignments, List<Child> children) {
if(assignments == null) {
assignments = new ArrayList<String>();
for(Child c: children)
assignments.add(c.getId());
return assignments;
} else {
List<String> updatedAssignments = new ArrayList<String>();
for(String assignment: assignments) {
for(Child c: children)
//append next permutations for a new crayon to existing "words"
updatedAssignments.add(assignment+c.getId());
}
return updatedAssignments;
}
}
}
这会生成预期的分配词列表(准确地说是 2187 个词),因为 7 支蜡笔中的每支都有 3 种可能性(即 3^7 = 2187)。
【问题讨论】:
-
您可以生成由
x唯一字符和y-1管道组成的单词排列。说红色、绿色、蓝色的 1、2、3。然后 1|23|对应一个分布。确保字符是有序的,并且你得到了每个排列的分布。
标签: java algorithm loops collections