首先需要整理出一个整体思路,第一需要一个标记书本是否发给人的一个标记数组flag[],其次还需要一个二维数组j记录学生喜欢的是哪几本书的二维数组like[i][j],表示的是第i个人喜欢第j本书。
#include<bits/stdc++.h>
using namespace std;
int s,x;
bool flag[50],like[50][50];//like[i][j]表示第i个人喜欢第j本书
void dfs(int i)
{
for(int j=1;j<=x;j++)//
{
if(flag[j]&&like[i][j])//如果此书未被选,且第i个人喜欢这本书
{
flag[j]=0;//把此书选了
if(i==x) s++;//dfs的出口是搜索到了第i个人
else dfs(i+1);//接着去搜索第i+1个人
flag[j]=1;//回溯
}
}
}
int main()
{
cin>>x;
int t1,t2;
for(int i=1;i<=x;i++)
{
cin>>t1>>t2;
like[i][t1]=true;
like[i][t2]=true;
}
memset(flag,true,sizeof(flag));
dfs(1);
cout<<s<<endl;
system("pause");
return 0;
}
首先要思考搜索的方式,一定要把这些拆分出来的数存入数组中去,因为只有这样才能控制后面一个数一定比前面的数大,然后就是思考这个函数的出口,显而易见,对于这道题来说就是s为0
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[10001]={1},n,total;
int search(int ,int);
int print1(int);//函数在前面要预先声明一下,否则会报错
int search(int s,int t)
{
for(int i=a[t-1];i<=s&&i!=n;i++)//s这里面传入的是这个自然数,这里面将a[0]设置成1的意义就体现出来了
//if(i<n)//如果不加这句,那么这个数本身也会作为一个答案输出
{
a[t]=i;
s-=i;
if(s==0) print1(t);//出口
else search(s,t+1);
s+=i;//回溯
}
}
int print1(int t)
{
for(int i=1;i<=t-1;i++)
cout<<a[i]<<"+";
cout<<a[t]<<endl;
}
int main()
{
cin>>n;
search(n,1);
system("pause");
return 0;
}