帆软笔试 立方数
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;
public class CubeSumDP {
public static ArrayList<Integer> findCubes(int N) {
int[] dp = new int[N + 1];
int[] lastUsed = new int[N + 1]; // 用于追踪每个状态对应的立方数
Arrays.fill(dp, Integer.MAX_VALUE);
Arrays.fill(lastUsed, -1);
dp[0] = 0; // base case
// 预计算所有的立方数
ArrayList<Integer> cubes = new ArrayList<>();
for (int i = 1; i * i * i <= N; i++) {
cubes.add(i * i * i);
}
// 动态规划填充dp数组
for (int i = 1; i <= N; i++) {
for (int cube : cubes) {
if (cube > i) continue;
if (dp[i] > dp[i - cube] + 1) {
dp[i] = dp[i - cube] + 1;
lastUsed[i] = cube;
}
}
}
// 重构解
ArrayList<Integer> result = new ArrayList<>();
int current = N;
while (current > 0) {
result.add((int)Math.cbrt(lastUsed[current]));
current -= lastUsed[current];
}
Collections.sort(result,Collections.reverseOrder());
return result;
}
public static void main(String[] args) {
int N = 43;
ArrayList<Integer> result = findCubes(N);
System.out.println("结果: " + result);
}
}
查看3道真题和解析