题解:P11246 [GESP202409 六级] 小杨和整数拆分
洛谷P11246[GESP202409六级] 小杨和整数拆分
一道很简单的动态规划题目。
思路
感觉全题的难点在于推转移方程。
看一眼数据范围只是普通的
那么跑两层循环 ,外层跑 水完成这题了。
考察
或许这方程是唯一难点。普通的完全背包。我们把最大价值更换为最少用到的数理解即可。 每一次的状态是分和不分完全平方数。
dp[i] = min(dp[i], dp[i - j * j] + 1);
AC代码
AC代码如下:
(题目中的
#include <bits/stdc++.h>
using namespace std;
int n;
const int MAXN = 1e5 + 10;
int dp[MAXN];
int solve(int n)
{
dp[0] = 0;//初始化
for (int i = 1 ; i <= n ; ++i)
{
for (int j = 1 ; j * j <= i ; ++j)
{
dp[i] = min(dp[i], dp[i - j * j] + 1);
}
}
return dp[n];
}
int main() {
memset(dp,n+1,sizeof(dp));//初始化一下dp数组的值 因为需要求min的值 所以将dp[]的值往大了放
cin >> n;
cout << solve(n) << endl;
return 0;
}