硬币面值方案

题目描述:

小Q十分富有,拥有非常多的硬币,小Q拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好各有两个面值为2^K的硬币,所以小Q拥有的硬币就是1,1,2,2,4,4,8,8……。
小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,先贴在这儿,看看后面能不能想出好办法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值