今天班上的女孩子问我两道搜索题,感觉自己好快,,,好久没这么自信过了 !!
第一题是这样的
给定两个数n m问把n拆成m个数相加
输出方案数,只记得n,m都不大
下面贴一下代码
#include<iostream>
using namespace std;
int n,k;
long r;
void dfs(int a,int b,int n)
{
long m;
if(a==k){
r++;
return ;
}
for(m=b;m<=n/2;m++)
dfs(a+1,m,n-m);
}
int main()
{
while(cin>>n>>k){
r=0;
dfs(1,1,n);
cout<<r<<endl;
}
return 0;
}
第二题好像有点意思,输入n,输入它的全排列
比如输入3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include <bits/stdc++.h>
bool vis[20];
int a[20];
int n;
void dfs(int cur)
{
int i,j;
if(cur==n+1){
for(i=1;i<=n;i++){
printf("%d",a[i]);
}
printf("
");
}
else{
for(i=1;i<=n;i++){
if(!vis[i]){
a[cur]=i;
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF){
dfs(1);
}
return 0;
}