PAT 甲级 1103 Integer Factorization(30 分)Java实现

版权声明:转载请注明出处 https://blog.csdn.net/qq799028706/article/details/89033474

1. 题意

给定正整数N、P、K,将N表示成K个正整数的P次方和
N = n1^p + .. + nk^p, 可能有多种解,选择底数最大的解

2. 思路

搜索,然后剪支。

注意,

  1. 保存解的时候不能用LinkList这个数据结构很消耗内存,会超过内存限制要用ArrayList
  2. 数组要开够,应该开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");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq799028706/article/details/89033474