神奇的四次方数(洛谷P1679题题解,Java语言描述)

题目要求

P1679题目链接

在这里插入图片描述

分析

可以使用DP去做,当做“完全背包问题”问题来处理。

初值: f [ 0 ] = 0 f[0]=0

c o s t [ ] cost[] c o s t [ i ] = i i i i cost[i] = i*i*i*i

状态转移方程: f [ j ] = M a t h . m i n ( f [ j ] , f [ j c o s t [ i ] ] + 1 ) f[j] = Math.min(f[j], f[j-cost[i]]+1)

AC代码(Java语言描述)

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        scanner.close();
        int[] f = new int[num+1];
        Arrays.fill(f, (int)1e8);
        f[0] = 0;
        int limit = (int)Math.pow(num, 0.25);
        int[] cost = new int[limit+1];
        for (int i = 0; i <= limit; i++) {
            cost[i] = i*i*i*i;
        }
        for(int i = 1; i <= limit; i++) {
            for(int j = cost[i]; j <= num; j++) {
                f[j] = Math.min(f[j], f[j-cost[i]]+1);
            }
        }
        System.out.println(f[num]);
    }
}

拓展

如果把四次方数改为平方数,就可以依据“拉格朗日四平方和定理”来求解。

拉格朗日四平方和定理

强势安利“ 拉格朗日四平方和定理 ”:每个正整数均可表示为 4 4 个整数的平方和。

定理内容
每个正整数均可表示成 4 4 个整数的平方之和。

定理说明
注意有些整数不可表示为 3 3 个整数的平方和,例如 7 7

重要的推论

  1. 数 n 如果只能表示成四个整数的平方和,不能表示成更少的数的平方之和,必定满足 4 a ( 8 b + 7 ) 4a(8b+7)
  2. 如果 n n%4==0 k = n 4 k=\frac{n}{4} n n k k 可由相同个数的整数表示。

定理证明
f r o m from 知乎

如何利用推论求一个正整数最少需要多少个数的平方和表示

  1. 先判断这个数是否满足 4 a ( 8 b + 7 ) 4a(8b+7) ,如果满足,那么这个数就至少需要 4 4 个数的平方和表示。
  2. 如果不满足,再在上面除以 4 4 之后的结果上暴力尝试只需要 1 1 个数就能表示和只需要 2 2 个数就能表示的情况。
  3. 如果还不满足,那么就只需要 3 3 个数就能表示。
发布了700 篇原创文章 · 获赞 1489 · 访问量 67万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104843052