版权声明:转载请注明出处 https://blog.csdn.net/Hanoi_ahoj/article/details/83351260
- 在n个球中,任意取m个(不放回),求有多少种取法
#include <stdio.h>
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\n", k);
return 0;
}
- 求n个元素的全排列
// abc acb bac bca cab cba
#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;
//printf("%d\n",length);
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;
}