- 在n個球中,任意取m個(不放回),求有多少種取法
#include <stdio.h>
int f(int n, int m)
{
if (n<m)
{
return 0;
}
if (m==0)
{
return 1;
}
if (n==m)
{
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\n", k);
return 0;
}
- 求n個元素的全排列
#include <stdio.h>
void f(char data[], int length, int cur)
{
if(cur==length)
printf("%s\n", 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;
f(data, length, 0);
return 0;
}
- 兩個串的最大公共子序列的長度
#include <stdio.h>
#include <string.h>
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\n", ret);
return 0;
}