题目背景
在你的帮助下,v 神终于帮同学找到了最合适的大学,接下来就要通知同学了。在班级里负责联络网的是 dm 同学,于是 v 神便找到了 dm 同学,可 dm 同学正在忙于研究一道有趣的数学题,为了请 dm 出山,v 神只好请你帮忙解决这道题了。
题目描述
将一个整数 𝑚m 分解为 𝑛n 个四次方数的和的形式,要求 最小。例如,当 = 706 时,因为 ,所以有 = 2。可以证明此时 最小。
输入格式
一行,一个整数 。
输出格式
一行,一个整数 。
样例输入
706
样例输出
2
思路
这道题很容易看出来是个完全背包问题只不过要我们求最小值递推关系
这里我们让 i = 1 to 18 (18 ^ 4 >100000)
这里我们可以省略掉c[i]数组了
我们只需要将初始化为 并且
还有一些微小的改动
参考代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 100005;
int a[N], dp[N];
int main()
{
/*ios::sync_with_stdio(0);
cin.tie(0);*/
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
int m, cnt = 18;
cin >> m;
for(int i = 1; i <= cnt; i++)
a[i] = i * i * i * i;
for(int i = 1; i <= cnt; i++)
{
for(int j = a[i]; j <= m; j++)
{
if(dp[j] > dp[j - a[i]] + 1)
dp[j] = dp[j - a[i]] + 1;
}
}
cout << dp[m];
return 0;
}