洛谷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;
}

浙公网安备 33010602011771号