我试图想出一个递归算法,在完全随机的情况下生成所有可能的子 - 父分配可能性。
例如,假设我有3个孩子和2个父母,所有孩子将被随机分配给每个父母,并有以下可能的结果
Parent 1 Parent 2
0 Children 3 Children
1 Children 2 Children
2 Children 1 Children
3 Children 0 Children
我一直试图绕过这样的方式,递归地提供孩子的数量和父母的数量以及其他变量以跟踪当前状态,但一直无法找到任何有效的。它需要为任何特定数量的父母和孩子工作。
有没有人有任何想法?我用Java编码,虽然它不是代码,而是我需要帮助的算法。
答案 0 :(得分:2)
假设你有n个孩子和k个父母。然后,以下算法(在伪java中)应该起作用:
int[] childrensForParent = new int[k];
/**
* Method assigns numberOfChildren children to parents with indices from
* parentIndex to k-1
*/
void assignChildren(int parentIndex, int numberOfChildren) {
if(parentIndex==k-1) {
//All children left go to the last parent in a row
childrensForParent[parentIndex] = numberOfChildren;
//Do something with the result
output(childrensForParent);
return;
}
for(int childrenCount= 0; childrenCount<=numberOfChildren; childrenCount++) {
//assign children to current parent
childrensForParent[parentIndex] = childrenCount;
//assign children that left to next parents
assignChildren(parentIndex+1, numberOfChildren-childrenCount);
}
}
//Method call
assignChildren(0,n);
简短解释:
k
个父母和n
个孩子
x
(从0到n
)
x
个孩子分配给当前的父级n-x
个孩子分配给剩余的(k-1
)父母(递归电话)。 其他信息:
上述算法会将n
的所有非负分区生成k
个部分。看看这些文章:
答案 1 :(得分:1)
这一切都是完全未经测试的,但您可以从以下逻辑/伪代码开始:
// Define your starting objects/data
define a parent object that has a list field of children
define "parents" as an array of parent objects
define "children" as an array of children objects
// Prepare the data
randomize the "children" array via a shuffling algorithm
// Define your recursive method
define recursiveAssignChildren(parents, children):
if children is empty, exit method
take the first element of "children" and assign it to a random parent
define lessChildren as children, excluding the first element that was already assigned to a parent
call recursiveAssignChildren(parents, lessChildren)
// Call the recursive method to start process
call recursiveAssignChildren(parents, children)
答案 2 :(得分:0)
问题制定者所戴的封面很多问题。这可以通过制作问题来实现,因为有人告诉你一个谜语(长句,少信息)。所以,要发现这个问题,你会这样想:由于孩子需要以各种可能的方式分配给父母,而不是处理这个问题,你有两个数字n1,n2(分别是父母的子女数)你想要使用n2添加添加n1所以如果你有3个孩子需要分配给2个父母,你想要使用2个额外的操作形成3
void generateAll(int c, int p, string str)
{
if (c == 0 && p == 0)
{
cout << str << endl;
return;
}
// if there are no parents and c > 0 then no children going to be asigned to any parent
if (p == 0 && c > 0)
return;
// loop throug number of children
for (int i = 0; i <= c; i++)
{
generateAll(c - i, p - 1, str + "\t"+ toString(i));
}
}