一道小题,dfs耗时

答案解法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int m, n;

int dfs(int u, int sum, int last)
{
    if (u == n)
    {
        if (sum == 0) return 1;
        return 0;
    }

    int res = 0;
    for (int i = last; i <= sum; i ++ )
        res += dfs(u + 1, sum - i, i);

    return res;
}

int main()
{
    while (cin >> m >> n)
        cout << dfs(0, m, 0) << endl;

    return 0;
}

image

这样从小遍历使0排在前面,像000...000m,所以我想把它变成m000...000这样遍历第一次m时就直接返回1.
刚开始出了一点小问题,以至于时间更高了。
修改后如下:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
int dfs(int u,int sum,int last)
{
    if(sum==0)
    {
     return 1;
    }
    if(n==u)
        return 0;
    int res=0;
    for (int i = min(last,sum); i > 0; i -- ) //zhuyi
    {
        res+=dfs(u+1,sum-i,i);
    }
    return res;
}
int main()
{

    while(cin>>m>>n)
    {
        cout<<dfs(0,m,m)<<endl;
    }
}

这里注意遍历时i取last和sum的较小值,否则像我刚开始那样取last就会导致有很多不必要的遍历,使耗时反而高了,又或者只取sum会有重复出现(因为盘子相同)如m=5 第一次取2,sum=3,则会和320重复。
image

耗时对比

答案:
image
修改:
image

posted @ 2022-08-09 11:30  束时  阅读(38)  评论(0)    收藏  举报