给定一个数t,以及n个整数,在这n个整数中找到相加之和为t的所有组合,例如t = 4,n = 6,这6个数为[4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合,它们的相加之和为4:4, 3+1, 2+2, and 2+1+1。请设计一个高效算法实现这个需求。
然后想了一下算法,大致的流程是这样 ,以 1 2 3 4举例
组合有 1 1种
2 12 2种
3 13 23 123 4种
4 14 24 124 34 134 234 1234 8种
类似这样,之前的组合再加上一个数就是新组合,于是准备用一个二维数组遍历所有情况,用到了递归
function jihe(a,thesum)
{
var b=new Array();
var fanwei=0;
var jg=new Array();
var jgsum=0;
function jianum(a,b,thesum,fanwei)
{ //递归function开始
if (fanwei<=a.length-1)
{ var c=new Array();
c[0]=a[fanwei];
//每行的第一个单独元素的数组
var thefirst=Math.pow(2,fanwei)-1;
b[thefirst]=new Array();
b[thefirst][0]=c[0];
if(sum(b[thefirst])==thesum)
{
if (isitsame(jg,b[thefirst]))
{
jg[jgsum]=b[thefirst];
jgsum++;
}
}
//处理结束
//其他数组
for (i=0;i<=Math.pow(2,fanwei)-2;i++)
{
var theother=Math.pow(2,fanwei)+i;
b[theother]=new Array();
b[theother]=b[i].concat(c);
if(sum(b[theother])==thesum)
{
if (isitsame(jg,b[theother]))
{
jg[jgsum]=b[theother];
jgsum++;
}
}
}
//处理结束
jianum(a,b,thesum,fanwei+1);
} //else结束
else
{return;}
} //function结束
jianum(a,b,thesum,fanwei);
return jg;
}
function sum(sz) //数组求和函数
{
var he=0;
for (ks=0;ks<=sz.length-1;ks++)
{
he=he+sz[ks];
}
return he;
}
function isitsame(as,bs) //重复判断
{
var sl=0;
while (sl<=as.length-1)
{
if (as[sl].sort().toString()==bs.sort().toString())
{
return false;
}
sl++;
}
return true;
}
var n=new Array(4,3,2,2,1,1);
var t=4;
var thejg=jihe(n,t); //返回一个符合条件的二维数组
for (k=0;k<thejg.length;k++)
{
document.write(thejg[k].join(' ')+'<br>');
}