洛谷OJ
来源:互联网 发布:centos zabbix 安装 编辑:程序博客网 时间:2024/05/18 22:50
- 题目描述
将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5;
1,5,1;
5,1,1;
问有多少种不同的分法。
- 输入
n,k (6<n<=200,2<=k<=6)
- 输出
- 一个整数,即不同的分法。
- 样例输入
7 3
- 样例输出
4
- 题目说明
四种分法为:
1,1,5;
1,2,4;
1,3,3;
2,2,3;
- 题目思路
这种题目等价于将n个求分成m堆,有多少种分法。
1:递归解决。dfs(n,m)表示n个球分成m堆的分法,
dfs(n,m) = dfs(n-m,m)+dfs(n-1,m-1)
2:搜索解决。
暴力搜索枚举所有情况,减枝一定不正确的情况。
- 题目代码
#include <cstdio> #include <iostream>#include <map>#include <set>#include <vector>#include <stack>#include <cmath>#include <string>#include <cstring>#include <algorithm>#define LL long long #define INF 99999999#define MOD 100003int dfs(int n, int m){ if(m > n) return 0; if(m == n) return 1; if(m == 1) return 1; return dfs(n-m,m)+dfs(n-1,m-1);}int n, k, ans = 0;int main(){ scanf("%d%d",&n,&k); printf("%d\n",dfs(n,k)); return 0;}
#include <cstdio> #include <iostream>#include <map>#include <set>#include <vector>#include <stack>#include <cmath>#include <string>#include <cstring>#include <algorithm>#define LL long long #define INF 99999999#define MOD 100003int n, k, ans = 0;int a[10];//cur 当前个数 sum当前总和// num 当前数列中最小值 void dfs(int cur, int num, int sum){ if(sum >= n || cur >= k){ return ; } // sum+num 最后一个无需枚举 (减枝) if(sum + num <= n && cur == k - 1){ ans++; return ; } for(int i = num; i <= n-sum; i++){ dfs(cur+1, i, sum+i); }}int main(){ scanf("%d%d",&n,&k); dfs(0,1,0); printf("%d\n",ans); return 0;}
阅读全文
1 0
- 洛谷OJ
- 洛谷OJ
- 洛谷oj
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- 洛谷OJ
- SDUT 3804 离散题目10
- Ganglia的安装、配置、运行
- 2015年中国最具竞争力机器人控制器企业10强
- Python SQLite使用详解
- mybatis maven 生成器插件使用
- 洛谷OJ
- vue+webpack引入 jquery 需要修改的地方
- Ubunt16.04安装CUDA cuDNN OpenCV Caffe完整教程
- Angular学习:Subject和Observable
- 模板字符串
- h5拖动实例
- jsp页面textarea框中值操作方式
- runLoop和runtime的分析
- 岑辉宇:谈谈这三年来做SEO推广的酸甜苦辣