查找多种生成数字的方法

时间:2016-05-09 07:30:53

标签: java algorithm dynamic-programming

我已经给了Fibonacci digits only,我必须找出使用K斐波那契数字生成数字的方法的数量。

约束:

1<=K<=10
1<=N<=10^9

例如:

N=14 and K=3

有两种方法:

(8,5,1) and (8,3,3) 

这是我的递归解决方案:

public static void num_gen(int i ,long val ,int used){

      if(used==0){

          if(val==n) ans++;
          return ;
      }

      if(i==Fib.length) return ;

      for(int j=0;j<=used;j++){

          long x = j*Fib[i];
          if(x+val<=n){
              num_gen(i+1,x+val, used-j);
          }
      }

}

对于大的N值和K = 10,此解决方案将超时。你能为我提供更复杂的算法吗?

2 个答案:

答案 0 :(得分:2)

这可以表示为乘法多项式,其中指数是斐波纳契数。

因子数量为K.

结果是结果多项式的成员系数,其指数等于N.

实施例: 从3个数字组成7号的方法的数量是多少,其中这3个数字中的每一个都可以是1,2或3。

  

(x +x²+x³)³=x⁹+3x⁸+6x⁷+7x⁶+6x⁵+3x⁴+x³

结果为6,因为它是结果多项式的x⁷成员的系数。

答案 1 :(得分:1)

我想为您提供一种适用于其他语言的解决方案,我希望这有助于您在将其转换为Java的过程中学习。因为我不清楚如何帮助你修复你正在处理的递归解决方案,因为我认为不需要递归。此外,不需要预设的斐波纳契数列。

这是在Perl中,它适用于:

$ perl fibber.pl 3 14
8,5,1
8,3,3
2 matches

但我无法保证它完全正确。

#!/usr/bin/perl
use bigint;
use List::Util qw(sum);

my ($digits, $goal) = @ARGV;
if (!($digits > 0) || !($goal > 0)) {
    die "Missing 2 arguments: the number count to sum, the value they sum to.";
}

sub fib {
    my ($a, $b) = @_;
    return sub {
        if (0 == scalar @_) {
            (my $r, $a, $b) = ($a, $b, $a+$b);
            return $r;
        } else {
            ($a, $b) = @_;
            (my $r, $a, $b) = ($b, $a+$b, $a+$b+$b);
            return $r;
        }
    }
}

my @f = (0) x $digits;
   @f = map {fib(1,2)} @f;
my @d = map {$_->()}   @f;
my $count = 0;
while ($d[0] < $goal) {
    if ($goal == sum @d) {
        $count++;
        print(join(",", @d)."\n");
    }
    my ($i, $a, $b) = (0, $d[$i], $f[$i]->());
    $d[$i] = $b;
    while ($goal <= $d[$i]) {
        $i++;
        if ($i == $digits) {
            print "$count matches\n";
            exit 0;
        }
        ($a, $b) = ($d[$i], $f[$i]->());
        $d[$i] = $b;
    }
    while ($i > 0) {
        $i--;
        $d[$i] = $f[$i]->($a, $b);
    }
}
相关问题