版权声明:转载请注明出处 https://blog.csdn.net/qq799028706/article/details/89033474
1. 题意
给定正整数N、P、K,将N表示成K个正整数的P次方和
N = n1^p + .. + nk^p
, 可能有多种解,选择底数最大的解
2. 思路
搜索,然后剪支。
注意,
- 保存解的时候不能用
LinkList
这个数据结构很消耗内存,会超过内存限制要用ArrayList
- 数组要开够,应该开400以上
3. 代码
package adv1103;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @author zmj
* @create 2019/4/4
*/
public class Main {
static int n, k, p, sqr, max = -1;
static int[] num = new int[500];
static int[] vis = new int[500];
static ArrayList<Integer> list = new ArrayList<>();
// sum是选中数之和,baseSum是底数之和, cnt是选中的个数,index是下标
static void dfs(int sum, int baseSum, int cnt, int index) {
if (cnt == k && sum == n) {
if (baseSum > max) {
max = baseSum;
for (int i = 0; i < k; i++) {
vis[i] = list.get(i);
}
}
return ;
}
if (sum > n || cnt > k) return ;
if (index - 1 >= 0) {
list.add(index);
dfs(sum + num[index], baseSum + index, cnt + 1, index); // 选中
list.remove(list.size()-1);
dfs(sum, baseSum, cnt, index - 1); // 不选
}
}
static int power(int n, int k) {
int res = 1;
for (int i = 0; i < k; i++) {
res *= n;
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();
p = sc.nextInt();
sqr = (int)Math.sqrt(n) + 1;
for (int i = 0; i <= sqr; i++) {
num[i] = power(i, p);
}
dfs(0, 0, 0, sqr);
if (max != -1) {
System.out.print(n + " = ");
for (int i = 0; i < k; i++) {
if (i > 0) {
System.out.print(" + ");
}
System.out.print(vis[i] + "^" + p);
}
System.out.println();
} else {
System.out.println("Impossible");
}
}
}