当我阅读这个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
我应该怎么写这样的功能?
答案 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]