사과를 넣다

/*
사과 문제 풀이 분석
이것도 Recursion tree입니다. 귀속 함수로 해답을 구하려고 했지만 세부 사항이 맞지 않습니다.
역귀함수 사고방식은 다음과 같다.
f(m, n)는 m개의 사과, n개의 접시를 놓을 때의 방법을 나타내는데 다음과 같은 두 가지 상황이 있다.
1.m2.m>=n.즉, 과일이 접시보다 많다는 것은 두 가지 상황으로 나뉜다. (1) 모든 접시에 적어도 하나의 과일이 있다. 이 과일을 모두 떼어내고 넣는 방법은 수량이 변하지 않는다. f(m-n, n)이다.(2) 적어도 한 접시가 비어 있기 때문에 m개의 과일은 나머지 n-1개의 접시에 넣고 f(m, n-1)이다.
그래서 전체적으로 f(m, n)= f(m-n, n)+f(m, n-1).
귀속 출구:
1.n==1.모든 과일은 이 접시에 넣어야 한다. 단지 한 가지 넣는 방법이 있다. f(x,1)=1.
2.m==0.과일이 없으면 놓을 수 있는 방법은 오직 한 가지뿐이다. 그것은 접시가 모두 비어 있다는 것이다. f(0,x) = 1.
여기 주의하세요. 왜 m=1을 사용하지 않습니까?과일 하나만 남았는데 넣는 방법도 하나밖에 없잖아.단, 예를 들어 f(3,3) = f(3,2) + f(0,3), 이때 m는 0이고 출구 m==1에서 수렴되지 않아 데이터를 찾을 수 없습니다.
종합적으로 귀속 수출은 (n==1) ||(m==0)입니다. 물론 (n=1) ||(m==0) |(m==1)도 가능합니다.
*/
#include <stdio.h>
#include <stdlib.h>

int func(int m, int n)
{
    if (m==0 || n==1) return 1;
    if (m<n) return func(m,m);
    else return (func(m-n, n) + func(m, n-1));
}

int main()
{
    int i, t, m, n;
    int a[20];
    scanf("%d", &t);
 
    for (i=0; i<t; ++i)
    {
        scanf("%d", &m);
        scanf("%d", &n);
        a[i] = func(m, n);
    }
 
    for (i=0; i<t; ++i)
    {
        printf("%d
", a[i]); } //system("pause"); return 0; }

제목 첨부, poj1664:

4: 사과 넣기


보기제출 통계질문총 시간 제한:
1000ms 
메모리 제한:
65536kB
묘사
같은 사과 M개를 N개의 같은 접시에 넣으면 어떤 접시가 비어 있어도 놓지 않을 수 있다. 모두 몇 가지 다른 분법이 있느냐고 물었다.(K로 표시) 5, 1, 1과 1, 5, 1은 같은 분법이다.
입력
첫 번째 줄은 테스트 데이터의 수 t(0<=t<=20)이다.다음 행에는 공백으로 구분되는 두 개의 정수 M과 N이 있습니다.1<=M,N<=10.
출력
입력한 각 데이터 M 및 N의 경우 해당 K를 한 줄로 내보냅니다.
샘플 입력
1
7 3

샘플 출력
8

출처
lwx@POJ

좋은 웹페이지 즐겨찾기