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)
我需要:
最终目标是看看哪些组合可以等于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)
任何帮助表示赞赏,如果我不清楚任何事情我会尽可能地澄清,谢谢!
编辑:我还建议运行它来等同于所有可能的结果并将其存储在哈希表中,以便在使用正确的值时使用?不确定哪种方法效果最好.
采用“OR Javascript”选项...
expected_result - total位于前缀关联数组中时才用后缀排列填充它。// 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)