在n个整数中找到相加之和为t的所有组合

给定一个数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>');
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值