首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算法:返回求和y的x次方的最小项数

算法:返回求和y的x次方的最小项数
EN

Stack Overflow用户
提问于 2017-10-13 01:41:13
回答 1查看 257关注 0票数 0

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

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

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

我该如何编写这样的函数呢?

EN

回答 1

Stack Overflow用户

发布于 2017-10-13 04:02:14

解决这个问题的最简单方法是使用递归贪婪算法,删除最大数m <= sum,其中m = p^n,直到sum为0,在这种情况下,您已经找到了解决方案,或者是负的,在这种情况下,您将p减去1。接受具有最小项数的解决方案。

您可以使用术语pow(10, log10(sum)/n)查找p的最大可能值

下面是一些用于说明的Java代码:

代码语言:javascript
复制
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();
    }
}   

输出:

代码语言:javascript
复制
2,7
[2, 1, 1, 1]

2, 9
[3]

3, 9
[2, 1]

3, 32
[2, 2, 2, 2]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46715784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档