木を作ることで解決できると思います。各ノードには、値のリストがあります。このリストの合計が必要な合計よりも少ないと仮定すると(Sと呼びましょう)、このノードの子を最大3つ作成できます。1つはこのノードのリストに1を追加し、もう1つは2を追加し、もう1つは3を追加します。子を作成するための条件は、新しいリストの合計がSよりも少ないことです。最後に、つまり、新しいノードを生成できない場合、ツリーのノードにすべてのシーケンスがあります。
編集:C#では私の貧弱な説明はそのようなsthを与えるでしょう:
最初:
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ではなく「data」から開始します。