一道小题,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;
}

这样从小遍历使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重复。

耗时对比
答案:

修改:


浙公网安备 33010602011771号