题目要求
分析
可以使用DP去做,当做“完全背包问题”问题来处理。
初值:
:
状态转移方程:
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]);
}
}
拓展
如果把四次方数改为平方数,就可以依据“拉格朗日四平方和定理”来求解。
拉格朗日四平方和定理
定理内容
每个正整数均可表示成
个整数的平方之和。
定理说明
注意有些整数不可表示为
个整数的平方和,例如
。
重要的推论
- 数 n 如果只能表示成四个整数的平方和,不能表示成更少的数的平方之和,必定满足 。
- 如果 , , 和 可由相同个数的整数表示。
定理证明
知乎
如何利用推论求一个正整数最少需要多少个数的平方和表示
- 先判断这个数是否满足 ,如果满足,那么这个数就至少需要 个数的平方和表示。
- 如果不满足,再在上面除以 之后的结果上暴力尝试只需要 个数就能表示和只需要 个数就能表示的情况。
- 如果还不满足,那么就只需要 个数就能表示。