这个每次都要递归到i=1才能结束,时间超限了 90分
#include<bits/stdc++.h>
using namespace std;
int ans=0;
void dfs(int m)
{
ans++;//其实这个直接++,把本身算一种情况,递归
for(int i=1;i<=m/2;i++)//递归出口是不能遗漏的这个递归出口是当m=1时不执行for
dfs(i);
}
int main()
{
int n;
cin>>n;
dfs(n);
cout<<ans<<endl;
return 0;
}
对上述的程序改进一下,用记忆搜索,设h[i]表示自然数i满足题意三个条件的个数 。如果用递归求解,会重复来求一些子问题。例如在求h[4]时,需要在求h[1]和h[2]的值,现在我们用h数组记录在记忆求解过程中得出所有子问题的解,当遇到重复子问题时,直接使用前面记忆的结果
#include<iostream>
#include<iomanip>
#include<cstring>
using namespace std;
int h[1001];
void dfs(int m)
{
if(h[m]!=-1) return ;//说明前面已经求得h[m]的值,直接引用即可,不需要再递归
h[m]=1;//将h[m]设置为1,表示m本身为一种情况
for(int i=1;i<=m/2;i++)
{
dfs(i);
h[m]+=h[i];
}
}
int main()
{
int n;
cin>>n;
memset(h,-1,sizeof(h));
dfs(n);//由顶到下记忆搜索求解
cout<<h[n]<<endl;
return 0;
}
其实这题还可以用递归