整数コレクションがあります。値の合計が X に等しい可能性をすべて取得する必要があります。
私はこのようなものが必要です。
記述できる言語: delphi、c#、php、RoR、python、cobol、vb、vb.net
整数コレクションがあります。値の合計が X に等しい可能性をすべて取得する必要があります。
私はこのようなものが必要です。
記述できる言語: delphi、c#、php、RoR、python、cobol、vb、vb.net
それが部分和問題です。そしてそれはNP-Completeです。
これを実装する唯一の方法は、可能なすべての組み合わせを生成し、合計値を比較することです。ただし、最適化手法は存在します。
C# の例を次に示します。
static class Program
{
static int TargetSum = 10;
static int[] InputData = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
static void Main()
{
// find all permutations
var permutations = Permute(InputData);
// check each permutation for the sum
foreach (var item in permutations) {
if (item.Sum() == TargetSum) {
Console.Write(string.Join(" + ", item.Select(n => n.ToString()).ToArray()));
Console.Write(" = " + TargetSum.ToString());
Console.WriteLine();
}
}
Console.ReadKey();
}
static IEnumerable<int[]> Permute(int[] data) { return Permute(data, 0); }
static IEnumerable<int[]> Permute(int[] data, int level)
{
// reached the edge yet? backtrack one step if so.
if (level >= data.Length) yield break;
// yield the first #level elements
yield return data.Take(level + 1).ToArray();
// permute the remaining elements
for (int i = level + 1; i < data.Length; i++) {
var temp = data[level];
data[level] = data[i];
data[i] = temp;
foreach (var item in Permute(data, level + 1))
yield return item;
temp = data[i];
data[i] = data[level];
data[level] = temp;
}
}
}