题解:洛谷 1679 神奇的四次方数

【题目来源】

洛谷:P1679 神奇的四次方数 - 洛谷

【题目描述】

将一个整数 \(m\) 分解为 \(n\) 个四次方数的和的形式,要求 \(n\) 最小。例如,当 \(m=706\) 时,因为 \(706=5^4+3^4\),所以有 \(n=2\)。可以证明此时 \(n\) 最小。

【输入】

一行,一个整数 \(m\)

【输出】

一行,一个整数 \(n\)

【输入样例】

706

【输出样例】

2

【算法标签】

《洛谷 P1679 神奇的四次方数》 #模拟# #动态规划DP# #搜索# #数学# #背包DP#

【代码详解】

#include<bits/stdc++.h>
using namespace std;

int n, dp[100005];  // n: 目标数,dp: 动态规划数组

int main() 
{
    cin >> n;  // 读入目标数
    
    memset(dp, 0x3f, sizeof(dp));  // 初始化dp数组为无穷大
    dp[0] = 0;  // 凑出0需要的数字个数为0
    
    // 完全背包问题
    for (int i = 1; i <= 18; i++)  // 遍历所有可能的四次方数
    {
        int x = i * i * i * i;  // 计算i的四次方
        for (int j = x; j <= n; j++)  // 从x开始遍历到n
        {
            // 状态转移方程:dp[j] = min(dp[j], dp[j-x] + 1)
            // 要么不使用当前的x,要么使用当前的x
            dp[j] = min(dp[j], dp[j - x] + 1);
        }
    }
    
    cout << dp[n];  // 输出凑出n所需的最小数字个数
    return 0;
}

【运行结果】

706
2
posted @ 2026-02-21 17:13  团爸讲算法  阅读(2)  评论(0)    收藏  举报