고전 귀속 문제1

14518 단어
  • n개의 공 중에서 임의로 m개(돌려보내지 않음)를 취하고 몇 가지 추출법을 구한다
  • 
    #include 
    
    int f(int n, int m)
    {
        if (n<m)    // 3 4   0 
        {
            return 0;
        }
        if (m==0)   // 3 0   1 
        {
            return 1;
        }
        if (n==m)   // 3 3   1 
        {
            return 1;
        }
        return f(n-1, m-1) + f(n-1, m);
    }
    
    int main(int argc, const char * argv[])
    {
        int k = f(5, 3);
        printf("%d
    "
    , k); return 0; }
  • n개 원소의 전체 배열을 구한다
  • 
    // abc acb bac bca cab cba
    #include 
    
    void f(char data[], int length, int cur)
    {
    	if(cur==length)
    		printf("%s
    "
    , data); for(int i=cur; i<length; i++) { { // char tmp = data[i]; data[i] = data[cur]; data[cur] = tmp; } f(data, length, cur+1); { // char tmp = data[i]; data[i] = data[cur]; data[cur] = tmp; } } } int main() { char data[] = "abcd"; int length = sizeof(data)/sizeof(data[0]) - 1; //printf("%d
    ",length);
    f(data, length, 0); return 0; }
  • 두 개의 직렬의 최대 공통 서열의 길이
  • 
    //  !
    
    #include 
    #include 
    
    int MAX(int a, int b)
    {
        return a>b?a:b;
    }
    
    int f(char *s1, char *s2)
    {
        if (strlen(s1)*strlen(s2) == 0)
        {
            return 0;
        }
        if (s1[0] == s2[0])
        {
            return f(s1+1, s2+1) + 1;
        }
        else
        {
            return MAX(f(s1+1, s2), f(s1, s2+1));
        }
    }
    
    int main(int argc, const char * argv[])
    {
        char *s1 = "abc";
        char *s2 = "xbacd";
        
        int ret = f(s1, s2);
        printf("%d
    "
    , ret); return 0; }

    좋은 웹페이지 즐겨찾기