题解P1025 [NOIP2001 提高组] 数的划分

以为黄题又要耽误我一个小时(结果看了眼样例暴力dfs过了

题目传送门:[NOIP2001 提高组] 数的划分 - 洛谷

分析题目

观察题目,发现每种分法的后一项一定比前面哪一项大于或者等于

把7分成三份,每份不能为0

分第一份:

当前能够分的有7

因为后面两份不能为0,所以最多到 7- ( 3 - 1) = 5

分到后面每一份也是一样的

上代码

#include<iostream>
using namespace std;
int n,k,ans;
int shuzu[201];//存储答案
void dfs(int num,int shengyu){//num表示分到第几份,剩余多少能分
	if(num==k+1){
        //分到第k+1份结束
		if(shengyu==0){
            //只有刚好分完才算
			ans++;
		}
		return;//记得返回
	}
	for(int i= shuzu[num-1]==0 ?1 : shuzu[num-1] ; i<=shengyu-(k-num) ;i++ ){
        //因为每一项都比前一项大或者相等,但num=1时前一项是0,因此偷懒用了双目运算符特判(
        //i<=shengyu-(k-num) 考虑到不能为0,所以给后面的位数都至少留1
		shuzu[num] = i;//存答案
		dfs(num+1,shengyu-i);//下一项,剩余减
	}
}
int main(){
	cin>>n>>k;
	dfs(1,n);//一开始剩余n
	cout<<ans;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值