algorithm:返回带有幂x的最小项数,得到和

时间:2017-10-12 17:41:13

标签: algorithm

当我阅读这个geeksforgeeks页面时 http://www.geeksforgeeks.org/minimum-number-of-power-terms-with-sum-equal-to-n/

我开始想知道我们是否稍微改变了这个问题,而不是得到总和等于n的最小幂项数,我们写一个函数minPower(power,sum):

minPower(2,7)返回4,因为7 = 2 ^ 2 + 1 ^ 2 + 1 ^ 2 + 1 ^ 2

minPower(2,9)返回1,因为9 = 3 ^ 2

minPower(3,9)返回2,因为9 = 2 ^ 3 + 1 ^ 3

我应该怎么写这样的功能?

1 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法是使用递归贪婪算法,删除最大数字m <= sum,其中m = p^n,直到sum为0,在这种情况下,您已找到解决方案或者是否定的,在这种情况下,您将p减少1.接受具有最少术语数的解决方案。

您可以使用术语p

找到pow(10, log10(sum)/n)的最大可能值

这里有一些Java代码来说明:

public static void main(String[] args)
{       
    minPower(2, 7);
}

public static void minPower(int n, int sum)
{
    if(n < 1) throw new IllegalArgumentException();

    int maxPow = (int)Math.pow(10, Math.log10(sum)/n);

    List<Integer> min = new ArrayList<>();
    LinkedList<Integer> terms = new LinkedList<>();
    powers(n, sum, maxPow, terms, min);     
    System.out.println(min);
}

private static void powers(int n, int sum, int m, LinkedList<Integer> terms, List<Integer> min)
{
    if(sum == 0) 
    {
        if(min.isEmpty() || terms.size() < min.size())
        {
            min.clear();
            min.addAll(terms);
        }
        return;
    }
    else if(sum < 0) return;

    for(int i=m; i>0; i--)
    {
        terms.addLast(i);
        powers(n, sum - (int)Math.pow(i, n), i, terms, min);
        terms.removeLast();
    }
}   

输出:

2,7
[2, 1, 1, 1]

2, 9
[3]

3, 9
[2, 1]

3, 32
[2, 2, 2, 2]