我认为你可以通过建造一棵树来解决这个问题。在每个节点上,您都有一个值列表。假设这个列表的总和小于所需的总和——我们称之为 S——,你最多可以为这个节点构建三个子节点:一个通过在这个节点的列表中添加 1,一个通过添加 2,一个通过添加 3 . 建立一个孩子的条件是新列表的总和仍然小于S。最后,即当您无法生成新节点时,您的所有序列都在树的节点中。
编辑:在 C# 中,我糟糕的解释会给出这样的结果:
第一的:
public class Node
{
public Node()
{
Children = new List<Node>();
}
public static int SumMax { get; set; }
public List<int> Values { get; set; }
public List<Node> Children { get; set; }
public void AddChild(int data)
{
if (Values.Sum() + data < SumMax)
{
Node child = new Node();
child.Values = new List<int>(Values);
child.Values.Add(data);
Children.Add(child);
for (int = data; i < 4; i++)
{
child.AddChild(i);
}
}
}
public void FillSequences(List<List<int>> sequences)
{
if (Values.Count != 0)
{
sequences.Add(Values);
}
foreach (Node child in Children)
{
child.FillSequences(sequences);
}
}
}
然后是主要的:
void Main()
{
Node.SumMax = 10;
Node root = new Node();
root.Values = new List<int>();
for (int i = 1; i < 4; i++)
root.AddChild(i);
List<List<int>> sequences = new List<List<int>>();
root.FillSequences(sequences);
//here you've got your sequences results in "sequences" and you can do what you want
}
我不知道它是否足够标准,但它大致完成了这项工作。我希望它能满足你的需要...
编辑:为了避免生成相同的序列,我们可以“排序”树:节点不能生成值低于其值的子节点。因此,在 AddChild 方法中,我们从“数据”而不是 1 开始循环。