洛谷P1025 数的划分(dfs)

#include<iostream>
#include<algorithm>
#include<cstdio>

using namespace std;
int ans = 0;
int n,k;
void dfs(int i,int t,int j){// t 层数,j 和 i 当前数 
   if (k == t) {
       if (j==n) ans++;
       return ;
   }
   
   for(int p = i ;p*(k-t)+j<=n ; p++)
   	  dfs(p,t+1,j+p);

}
int main(){

	cin>>n>>k;
	
		dfs(1,0,0);
	
	cout<<ans;
	return 0;
}

挺简单的dfs,为了保证不重复,只需要确保取数的是递增或递减的顺序(不需要严格递增,前后可以相等),
这次存在的问题是:第一,开始dfs是dfs(1,1,1)直接默认了一定会去到1,但其实有很多不取的时候,如果要1,1,1的话可能要在dfs里改一下程序,但还是1,0,0好一些,印象里大部分dfs都是从1,0,0开始,
第二 搜索边界时没有用if的嵌套直接,if(kt && jn)导致,如果k=t了但是j<>n,会一直搜索下去,导致tle,一直没有注意过.以后要注意在循环边界时不管怎样先全部return,再在前面补上其他操作,不要在if里用&&./

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值