【求助】站外CSP模拟题
  • 板块灌水区
  • 楼主小小小蒟蒻
  • 当前回复37
  • 已保存回复37
  • 发布时间2021/8/26 16:52
  • 上次更新2023/11/4 08:56:02
查看原帖
【求助】站外CSP模拟题
333990
小小小蒟蒻楼主2021/8/26 16:52

Link

就这道题,我找了百度几乎所有的题解,似乎都差不多……

#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;
}

这个“小优化”是什么意思啊……

要是您觉得我问的问题没有任何意义,请尽管骂我。

2021/8/26 16:52
加载中...