题目描述:
小Q十分富有,拥有非常多的硬币,小Q拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好各有两个面值为2^K的硬币,所以小Q拥有的硬币就是1,1,2,2,4,4,8,8……。
小Q有一天去购买恭喜东西需要支付n元钱,小Q想知道有多少种方案从他拥有的硬币中选取一些拼凑起来恰好是n元。(如果两种方案某个面值的硬币选取的个数不一样就考虑为不一样的方案)
小Q有一天去购买恭喜东西需要支付n元钱,小Q想知道有多少种方案从他拥有的硬币中选取一些拼凑起来恰好是n元。(如果两种方案某个面值的硬币选取的个数不一样就考虑为不一样的方案)
代码:
var num=6;
var n=Math.floor(Math.log(num)/Math.log(2));
var arr=[];
var tempArr=[];
var resultStr=[];
while(true)
{
arr[n]=1;
num=num-Math.pow(2,n);
if(num<=0)
break;
n=Math.floor(Math.log(num)/Math.log(2));
}
tempArr=arr.concat();
printresult();
for(var i=1;i<arr.length;i++)
{
tempArr=arr.concat();
for(var j=i;j<arr.length;j++)
{
if(arr[j]==1||arr[j]==2)
flow(j);
}
}
//递归
function flow(index)
{
for(var j=index;j>=1;j-- )
{
if(j==1)
{
if(tempArr[j-1]==undefined||tempArr[j-1]==0)
{
tempArr[j]--;
tempArr[j-1]=2;
printresult();
}
}
else
{
if(tempArr[j-1]==undefined||tempArr[j-1]==0)
{
tempArr[j]--;
tempArr[j-1]=2;
printresult();
flow(j-1);
}
else if(tempArr[j-1]==1&&tempArr[j-2]!=2&&tempArr[j-2]!=1)
{
tempArr[j]--;
tempArr[j-1]=2;
tempArr[j-2]=2;
printresult();
flow(j-2);
}
}
}
}
function printresult()
{
var str='';
for(var i=0;i<tempArr.length;i++)
{
if(tempArr[i]==1)
{
str+=(Math.pow(2,i)).toString()+" ";
}
if(tempArr[i]==2)
{
str += (Math.pow(2, i)).toString() + " ";
str += (Math.pow(2, i)).toString() + " ";
}
}
if(resultStr.indexOf(str)<0)
{
resultStr.push(str);
console.log(str);
}
}
console.log("种数:"+resultStr.length);
输入与输出:
num=6;
输出:
num=145;
输出:
上面这段代码应该是有点问题的,发现还是很难把所有情况都考虑周全,但自己总是绕不出来T-T,先贴在这儿,看看后面能不能想出好办法。