就这道题,我找了百度几乎所有的题解,似乎都差不多……
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,cs;
void dfs(long long wz,long long shu)
{
if(wz==n)//搜了n个数
{
if(shu==m)//正好所有数相加等于m
{
cs++;//有了一个新的方法
return;
}
return;
}
for(int i=0;i<=m-shu;i++)//一个小优化
{
dfs(wz+1,shu+i);//下一层循环
}
return;
}
int main()
{
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);//要写freopen,重要的事情写3遍。
scanf("%lld%lld",&n,&m);
dfs(0,0);//搜索开始
printf("%lld",cs);
return 0;
}
以上为百度的标程。大部分都懂了,但是DFS有些没懂。具体问题如下:
void dfs(long long wz,long long shu)
{
if(wz==n)//搜了n个数
{
if(shu==m)//正好所有数相加等于m
{
cs++;//有了一个新的方法
return;
}
return;
}
这一段的"wz==n"里:所有数相加为m就结束,但是为什么没有相加为m也要return?
for(int i=0;i<=m-shu;i++)//一个小优化
{
dfs(wz+1,shu+i);//下一层循环
}
return;
}
这个“小优化”是什么意思啊……
要是您觉得我问的问题没有任何意义,请尽管骂我。