解题思路:
(1)每一个数的左边都只能加上比它二分之一小的数,每一个数的的大问题都可以从比它小规模的子问题来拼凑而成,如下图所示:
(2)如果要求数字6的方案数,那么必须要知道1,2,3的方案数,这样的话形成了解决大问题必须先解决小问题的思路,符合递推(动态规划)的思想
(3)设f【n】是数字n的方案数,因为本身的数字也算一个数,所以f【n】都初始化为1
(4)递推公式为f【i】=f【i】+f【j】,循环枚举1-j(i/2)的方案数,依次累加即可。
(5)数字1000的方案数可能很大,所以使用long long 数组
#include<bits/stdc++.h>
using namespace std;
long long f[1010];
int main()
{
int n;
cin>>n;
for(int i=1;i<=1000;i++)
f[i]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i/2;j++)
{
f[i]=f[i]+f[j];
}
}
cout<<f[n];
return 0;
}