poj-1664 [사과 넣기]

1527 단어 DP조합 수학
사과를 놓다
Time Limit: 1000MS
 
Memory Limit: 10000K
Total Submissions: 30957
 
Accepted: 19540
Description
같은 사과 M개를 같은 접시 N개에 넣고 어떤 접시는 비워두고 놓지 않도록 허락하는데, 모두 몇 가지의 다른 분법이 있느냐고 물었다.(K로 표시) 5, 1, 1과 1, 5, 1은 같은 분법이다.
Input
첫 번째 줄은 테스트 데이터의 수량 t(0 <=t <=20)입니다.다음 행에는 공백으로 구분된 두 개의 정수 M과 N이 있습니다.1<=M,N<=10.
Output
입력한 각 데이터 그룹 M과 N에 대해 한 줄로 해당하는 K를 출력합니다.
Sample Input
1
7 3

Sample Output
8
이런 문제에 대해 만약에 수학 사상에 따라 조금씩 배열하고 싶다면 정말 쉽지 않다. 인터넷상에서 모두 귀환으로 하는 것을 보면 사실 나는 귀환을 잘하지 못한다. 이 문제를 읽은 후에 나는 할 줄 알지만 귀환이 어떻게 세밀하게 연산하는지 모르겠다. 나도 대략적인 것만 알 수 있다. 그는 사실 적은 것에서 많은 것으로, 귀환은 큰 것에서 작은 것으로, 작은 것에서 작은 것까지 작은 것에서 큰 데이터로 밀고 있다.우리는 매우 큰 데이터의 답을 알 수 없기 때문에 데이터가 적을 때의 답을 알 수 있다. (필자의 수다를 싫어하지 마라* *) 이 문제에 따라 우리는 m개의 사과를 분석한다. n개의 접시 dp(m, n)는 m개의 사과를 n개의 접시에 넣는 방안 수 1, 애플 m=1, (n>=1)dp(1, n)=1을 대표한다.2, n=1시, dp(m, 1)=1;3. n>=m일 때 dp(m,n)==dp(m,m);4. nm개의 사과를 n개의 접시에 놓으면 n개의 접시마다 사과와 dp(m, n-1)가 있다.그리고 이곳의 dp(m, n-1)는 다음 귀환에 들어갈 것이다. 계속 이러기 때문에 귀환은 공간을 낭비하는 복잡도와 시간 복잡도가 비교적 높다. n<=10을 발견할 수 있다.이유가 여기에 있는 것 같아요.
#include
int dp(int m,int n)
{
	if(m==1||n==1||n==0)
	return 1;
	else
	{
		if(n>m)
			return dp(m,m);
		else
			return dp(m-n,n)+dp(m,n-1); 
	} 
} 
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,m;
		scanf("%d%d",&m,&n);
		printf("%d
",dp(m,n)); } return 0; }

좋은 웹페이지 즐겨찾기