1.数据数量少,单个数据大小不限
int MixFuntion(int n)
{
int i = sqrt(n);
if (i*i == n)
return 1;
int minLen = INT_MAX;
for(;i*i >= n/2;i--)
{
int len = 1 + MinExpressionInteger(n - i*i);
if (minLen > len)
minLen = len;
}
return minLen;
}
先计算其中最大的一个平方数,如果等于i就返回1。
之后用递归的方式算出最大平方数为k*k时的len,在与最大平方数为其他值的情况进行比较,得出minlen
i
┌───┬──────┬───────────────┐
│ │ │ k*k │
└───┴──────┴───────────────┘
2数据数量大,单个数据小
const int MAX = 100000;
int MinNum[MAX+1] = {0};
int MixFuntion(int n ,int &mixLen)
{
if(n > MAX)
return 0;
int i = sqrt(n);
if(i*i == n)
{
MinNum[n] = 1;
return 1;
}
int flag = 0;
for(;i*i >= n/2;i--)
{
int num = n-i*i;
if(!MinNum[num])
MixFuntion(num);
if(!MinNum[flag] || MinNum[flag]>MinNum[num])
flag = num;
}
MinNum[n] = MinNum[flag] + 1;
mixLen = MinNum[n];
return 1;
}
方法是一样的,只不过拿了个数组记了一下。。。