C#或Javascript多次排列两个数组

Min*_*try 5 c# arrays concat permutation

我一直在工作,放弃,然后重新处理这个问题几天.我已经看了很多不同的方法,但是我要么无法正确实现它,要么它不适合我需要做的事情.

基本上:我有两个数组,前缀和后缀

 prefix = { 0, 0, 3, 8, 8, 15} 
 suffix = { 0, 3, 2, 7, 7, 9, 12, 15 }
Run Code Online (Sandbox Code Playgroud)

我需要:

  • 至少使用3个组合(2 + 1或1 + 2),最多使用6个(3 + 3).
  • 不要多次使用词缀(除非它重复(即前缀中有两个8))

最终目标是看看哪些组合可以等于X.

例如

X = 42
3 + 8 + 8 + 2 + 9 + 12 = 42
0 + 8 + 8 + 7 + 7 + 12 = 42
| Prefix |  | Suffix |

15 + 12 + 15 = 42
0 + 15 + 0 + 12 + 15 = 42
Run Code Online (Sandbox Code Playgroud)

我已经尝试过研究Permutations,IEnumerables,Concat等等但是找不到能成功做到这一点的东西.

这些是我需要使用的"完整"数组.

public int[] Prefix = {0, 6, 6, 8, 8, 8, 8, 8, 8, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 15, 15, 18, 18, 18, 18, 18, 18, 23 };
public int[] Suffix = {0, 3, 3, 9, 11, 11, 11, 17, 18, 18, 20, 25, 25, 27, 30, 30};
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏,如果我不清楚任何事情我会尽可能地澄清,谢谢!

编辑:我还建议运行它来等同于所有可能的结果并将其存储在哈希表中,以便在使用正确的值时使用?不确定哪种方法效果最好.

MT0*_*MT0 2

采用“OR Javascript”选项...

  1. 创建一个关联数组,将前缀的总计映射到生成该总计的前缀排列数组;然后填充它。
  2. 为后缀创建一个类似的第二个关联数组,但仅当expected_result - total位于前缀关联数组中时才用后缀排列填充它。
  3. 输出有效的后缀和相应的前缀。

JSFIDDLE

// Inputs
var prefixes = [0, 6, 6, 8, 8, 8, 8, 8, 8, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 15, 15, 18, 18, 18, 18, 18, 18, 23],
    suffixes = [0, 3, 3, 9, 11, 11, 11, 17, 18, 18, 20, 25, 25, 27, 30, 30],
    expected_result = 42;

// Associative Arrays
var prefixTotals = {},
    suffixTotals = {},
// Functions
    addTotal     = function( map, arr, other_map ){
        var t = 0, i = 0;
        for ( ; i < arr.length; ++i )
            t += arr[i].value;
        if (   ( other_map === undefined )
            || ( ( expected_result - t ) in other_map ) )
        {
            if ( !( t in map ) )
                map[t] = [];
            map[t].push( arr );
        }
    },
    calcPermutations     = function( affixes, map, other_map ) {
        var i = 0, j, k, l = affixes.length;
        for ( ; i < l; ++i )
        {
            addTotal( map, [ { index: i, value: affixes[i] } ], other_map );
            for ( j = i+1; j < l; ++j )
            {
                addTotal( map, [ { index: i, value: affixes[i] }, { index: j, value: affixes[j] } ], other_map );
                for ( k = j+1; k < l; ++k )
                {
                    addTotal( map, [ { index: i, value: affixes[i] }, { index: j, value: affixes[j] }, { index: k, value: affixes[k] } ], other_map );
                }
            }
        }
    },
    resultToString = function( affixes ){
        var s = [];
        for ( var i = 0; i < affixes.length; ++i )
            s.push( affixes[i].index + '=>' + affixes[i].value );
        return s.join(',');
    };

calcPermutations( prefixes, prefixTotals, undefined );
calcPermutations( suffixes, suffixTotals, prefixTotals );

var i,j,k,p,s,count = 0,html=[];
for ( i in suffixTotals )
{
    s = suffixTotals[i];
    p = prefixTotals[expected_result - i];
    for ( j = 0; j < p.length; ++j )
        for ( k = 0; k < s.length; ++k )
            html.push( 'Prefixes [' + resultToString( p[j] ) + '], Suffixes [' + resultToString( s[k] ) + ']' );
    count += p.length * s.length;
}
html.unshift( 'There were ' + count + ' valid permutations:' );

document.getElementById( 'out' ).innerHTML = html.join( '<br />' );
Run Code Online (Sandbox Code Playgroud)