P1679 神奇的四次方数
题目链接:P1679 神奇的四次方数 - 洛谷
题目描述
将一个整数 $m$ 分解为 $n$ 个四次方数的和的形式,要求 $n$ 最小。例如,当 $m = 706$ 时,因为 $706 = 5^4 + 3^4$,所以有 $n = 2$。可以证明此时 $n$ 最小。
100 分解法
完全背包变形
观察数据范围 $m \leq 100,000$。
$20^4 > 100,000$,所以四次方数的范围为 $1 \sim 20$。
$dp_{i,j}$ 表示用前 $i$ 种数($1 \sim 20$)配成 $j$ 的最少个数。
初始化:
- $w_i = i^4$
- $dp_{i,j} = \text{INF}$
- $dp_{0,0} = 0$
状态转移方程:
$dp_{i,j} = \min(dp_{i-1,j}, dp_{i,j-w_i} + 1)$
#include <bits/stdc++.h>
using namespace std;const int N = 21, M = 1e5 + 5;
int m, w[N], dp[N][M];int main() {cin >> m;for (int i = 1; i <= 20; i++)w[i] = i * i * i * i;memset(dp, 0x3f, sizeof(dp));dp[0][0] = 0;for (int i = 1; i <= 20; i++) {for (int j = 0; j <= m; j++) {dp[i][j] = dp[i - 1][j];if (j >= w[i])dp[i][j] = min(dp[i][j], dp[i][j - w[i]] + 1);}}cout << dp[20][m];return 0;
}
拓展知识
若将四次方数改为平方数同理,有拉格朗日四平方和定理:
每个正整数均可表示为四个整数的平方和。
