http://codevs.cn/problem/2549/
把一个数字分成几部分相加,最简单也最方便的做法当然是递归回溯。这题换了一个思路,换了一个算法。短短的3行花了好久去理解。用的dp做的,状态转移方程f[j] = f[j] + f[j - i];组成7的个数等于组成7的个数+组成6的个数,组成8的个数等于组成8的个数+组成7的个数—–组成n的个数等于组成n的个数+组成n-1的个数
组成7的个数 等于组成7的个数+组成5的个数——一直DP到组成n的个数等于组成n的个数加上组成1的个数。
感觉说着说着自己都乱啦~~自己看下状态转移方程吧~悟一悟吧
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int f[55] = { 0 };
f[0] = 1;
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
f[j] = f[j] + f[j - i];
}
cout << f[n] << endl;
system("pause");
return 0;
}