数的划分题解
2024-12-31 11:42:39
发布于:美国
97阅读
0回复
0点赞
虽然dfs没有dp快,但是这道题数据很小,如果在比赛中dp和dfs同样能过那最好还是用dfs,因为dfs的思路简单不容易错而且代码好写方便改错。这里因为要考虑到不重复,所以可以按升序记录每一次划分:记录上一次划分所用的数,保证当前划分所用数不小于上次划分所用分数,当划分次数等于k时比较该次划分所得总分是否与n相同并记录次数。
有一个不得不做的剪枝就是枚举当前划分所用分数时应该从last(上次划分所用分数)枚举到sum+i*(k-cur)<=n为止,因为之后划分的分数一定大于或等于当前划分所用分数。这个剪枝不做的话不仅会TLE,在TLE之间就爆栈RE了
#include<cstdio>
int n,k,cnt;
void dfs(int last,int sum,int cur)
{
if(cur==k)
{
if(sum==n) cnt++;
return;
}
for(int i=last;sum+i*(k-cur)<=n;i++)//剪枝,只用枚举到sum+i*(k-cur)<=n为止
dfs(i,sum+i,cur+1);
}
int main()
{
scanf("%d%d",&n,&k);
dfs(1,0,0);
printf("%d",cnt);
}
全部评论 1
AC
2ms/7.86m
#2
AC
2ms/7.93m
#3
AC
1ms/7.94m
#4
AC
3ms/7.98m
#5
AC
4ms/7.94m
#6
AC
6ms/7.86m
#7
AC
5ms/8.01m
#8
AC
7ms/7.93m
#9
AC
12ms/8.02m
#10
AC2025-02-08 来自 浙江
0
有帮助,赞一个