洛谷P1679 神奇的四次方数 题解

本题做法

  • 完全背包 DP。

思路

这题可以转化成完全背包 DP 问题来解答。设 \(dp[i][j]\) 表示枚举到 \(i^4\) 时和为 \(j\) 的最少四次方数个数,则每个四次方数的本身可以抽象为物体的体积,每个物体的价值为 1。

由于 \(1\le m\le 10^5\),所以我们最多只需要枚举 \(i\)\(\sqrt[4]{m}\) 即可。

由于 \(1\le m\le 10^5\),所以如果开二维数组的话会 MLE。于是我们使用滚动数组优化 DP。有状态转移方程:

\[dp[i]=\min\{dp[i],dp[i-w_i^4]+1\} \]

最后输出答案 \(dp[m]\) 即可。

代码

#include<bits/stdc++.h>

using namespace std;

typedef long long          ll;
typedef unsigned long long ull;

const int N=1e5+5;

int n,dp[N];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) dp[i]=INT_MAX;
    for(int i=1;i<=pow(n,1.0/4);i++){
        for(int j=i*i*i*i;j<=n;j++){
            dp[j]=min(dp[j],dp[j-i*i*i*i]+1);
        }
    }
    cout<<dp[n]<<endl;
    return 0;
}
posted @ 2025-08-09 15:08  2789617221guo  阅读(13)  评论(0)    收藏  举报