ural 1073. Square Country 动态规划

来源:互联网 发布:cctv1网络电视回看播放 编辑:程序博客网 时间:2024/05/18 04:36

题意:给定一个数N,求组成N的最少的平方数的个数。

思路:动态规划,我们知道dp[1] = 1,dp[2] = 2, dp[3] = 3, dp[4] = 1...

若 n = i+j*j,则dp[n] = min(dp[i]+1)(i+j*j=n)

#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int N = 60009;const int INF = 1<<30;int dp[N];int main(){    int n;    scanf("%d", &n);    int sq, i, j;    for (i = 1; i <= n; ++i)        dp[i] = INF;    dp[1] = 1;    for (i = 2; i <= n; ++i) {        sq = floor(sqrt(i*1.0));        for (j = 0; j <= sq; ++j) {            if (dp[i] > dp[i-j*j]+1)                dp[i] = dp[i-j*j]+1;        }    }    printf("%d\n", dp[n]);    return 0;}