[NOIP2001 提高组] 数的划分(剪枝)

1|0题目描述

将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如:n=7,k=3,下面三种分法被认为是相同的。

1,1,5
1,5,1
5,1,1

问有多少种不同的分法。

2|0输入格式

nk (6<≤2006<n200,2≤≤62k6)

3|0输出格式

1 个整数,即不同的分法。

4|0输入输出样例

输入 #1
7 3
输出 #1
4

5|0说明/提示

四种分法为:
1,1,5
1,2,4
1,3,3
2,2,3

【题目来源】

NOIP 2001 提高组第二题

复制代码
using namespace std; const int N=1e5+10; int a[N],res,n,k; void prit() { for(int i=1;i<k;i++) cout<<a[i]<<" "; cout<<a[k]<<endl; } void dfs(int now,int cnt) { if(cnt>k||now<0) return; for(int i=a[cnt-1];i<=now;i++)//题目要求颠倒顺序的不算,那么就要考虑如何消除,这里就可以使用一个数组来记录上一个的值 //如果当前不小于这个值,那么顺序就是递增的,额外提一嘴,数组此时也是储存的最小字典序的顺序; //这里的剪枝策略是,从不小于上一个值的位置开始,一直到现在的值 { a[cnt]=i; if(now-i==0&&cnt==k) res++,prit(); else dfs(now-i,cnt+1); } } int main() { a[0]=1; cin >>n>>k; dfs(n,1); cout<<res; return 0; }
复制代码

 


__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/17471057.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
-- --
点击右上角即可分享
微信分享提示