放苹果 分治法

http://poj.org/problem?id=1664



//整数划分问题

#include <iostream>

using namespace std;



/*

f(n,m)表示将正整数n划分成若干个不大于m的整数的和的分法

f(n,m) = 1							n = 1 || m = 1

		 f(n,n)						n < m

		 1 + f(n,n - 1)				n = m

		 f(n - m, m) + f(n, m - 1)	n > m > 1

*/





int f(int n, int m)

{

	if(n == 1 || m == 1)

		return 1;

	else if(n < m)

		return f(n, n);

	else if(n == m)

		return 1 + f(n ,n -1);

	else

		return f(n - m, m) + f(n, m - 1);

}



int main()

{

	int t,m,n;

	cin>>t;

	while(t--)

	{

		cin>>m>>n;

		cout<<f(m, n)<<endl;

	}

	return 0;

}



你可能感兴趣的:(分治法)