将n个小球放到k个盒子中的情况总数 = (a)至少有一个盒子只有一个小球的情况数 + (b)没有一个盒子只有一个小球的情况数

这样写出表达式:

a.因为盒子不加区分,那么=情况数与“将n-1个小球放到k-1个盒子中”的情况数相同

b.没有一个盒子只有一个小球,那么就把每个盒子中拿出来一个小球,对应的是“把(n-k)个小球放到k个盒子中的情况数”

然后将上面的思路化为递归式:

设f(n, k)代表将n个小球放到k个盒子中且没有空盒的情况,那么f(n, k) = f(n-1, k-1) + f(n-k, k)

而当k=1时只有1种方法(小球全部放进1个盒子)

// luogu-judger-enable-o2

/*******************
* problem: P1025 数的划分.
* user ID: 63720.
* user name: 航空信奥.
* time: 2018-05-14.
* mode: C++.
* upload place: Luogu.
*******************/ #include <stdio.h>
#include <iostream>
#define ll long long
using namespace std; ll f(int n, int k)
{
if (k <= 0 || n < k)
return 0; //* 有空盒或有球放不下去
if (n == k)
return 1; //* 一个盒子放一个球
else
return f(n-1, k-1) + f(n-k, k); //* 递归求解
} int main() // 完美主程序
{
ll n, k;
cin >> n >> k;
cout<< f(n, k);
return 0;
}

不加O2,1132ms,差点挂。

递归转递推(优化,0ms)

// luogu-judger-enable-o2

/*******************
* problem: P1025 数的划分.
* user ID: 63720.
* user name: 航空信奥.
* time: 2018-05-14.
* mode: C.
* upload place: Luogu.
*******************/ #include <stdio.h>
const int MaxK = 6 + 1;
const int MaxN = 200 + 1; /*******************
* 0ms优化 :
* 采用动态规划的思想,将递归转化为二维数组模式
* 注意开数组时,最好把空间大小+1
*******************/ int main()
{
int n, k;
scanf("%d%d", &n, &k);
int ans[MaxK][MaxN] = {0};
ans[0][0] = 1;
//f(n, k) = f(n-1, k-1) + f(n-k, k)
for (int i = 1; i <= k; i++)
for (int j = i; j <= n; j++)
ans[i][j] = ans[i - 1][j - 1] + ans[i][j - i];
printf("%d", ans[k][n]);
}

洛谷 题解 P1025 【数的划分】的更多相关文章

  1. 洛谷——P1025 数的划分

    P1025 数的划分 题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有 ...

  2. 【dfs】p1025 数的划分

    P1025 数的划分 题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有 ...

  3. P1025 数的划分

    P1025 数的划分f[i][j]表示把数i分成j份的方案数,分成两种情况,第一种是最小值是1,另一种是最小值不是1,对于不是1的情况,先都放一个1,那么f[i][j]=f[i-1][j-1]+f[i ...

  4. 洛谷P1102 A-B数对

    洛谷P1102 A-B数对 https://www.luogu.org/problem/show?pid=1102 题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A ...

  5. P1025 数的划分——简单题刷傻系列

    P1025 数的划分 学傻了,学傻了,什么dp搜索什么啊: #include<cstdio> #include<cstring> #include<algorithm&g ...

  6. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  7. P1025数的划分

    P1025数的划分 #include <iostream> using namespace std; int n,k; int cnt; void dfs(int s,int step,i ...

  8. 【题解】洛谷P3166 [CQOI2014] 数三角形(组合+枚举)

    洛谷P3166:https://www.luogu.org/problemnew/show/P3166 思路 用组合数求出所有的3个点组合(包含不合法的) 把横竖的3个点共线的去掉 把斜的3个点共线的 ...

  9. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

随机推荐

  1. 【集合系列】- 深入浅出分析LinkedHashMap

    一.摘要 在集合系列的第一章,咱们了解到,Map的实现类有HashMap.LinkedHashMap.TreeMap.IdentityHashMap.WeakHashMap.Hashtable.Pro ...

  2. java property 配置文件管理工具框架,避免写入 property 乱序

    property property 是 java 实现的 property 框架. 特点 优雅地进行属性文件的读取和更新 写入属性文件后属性不乱序 灵活定义编码信息 使用 OO 的方式操作 prope ...

  3. 半自动安装 linux 系统

    基于图形软件生成应答文件,实现半自动化安装 linux 操作系统 1.yum install -y system-config-kickstart 安装生成自动化安装操作系统的应答文件 2.syste ...

  4. 用 GitBook 创建一本书

    用 GitBook 创建一本书 Gitbook 首先是一个软件,它使用 Git 和 Markdown 来编排书本,如果你没有听过 Git 和 Markdown,那么 gitbook 可能不适合你直接入 ...

  5. day29 文件的上传和下载 socketserver(并发)

    文件上传的讲解: import subprocess res=subprocess.Popen("dir", shell=True, stderr=subprocess.PIPE, ...

  6. cropperjs实践及中文文档(自译)

    cropperjs是一款非常强大却又简单的图片裁剪工具,它可以进行非常灵活的配置,支持手机端使用,支持包括IE9以上的现代浏览器.(关键是使用方法简单,几行代码就可以搞定) 实践效果图 如图,可以对指 ...

  7. Python的os,shutil和sys模块

    *********OS*********** os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于Windows,它是'n ...

  8. ganglia 服务端

    #!/bin/bash #配置参数 serverIP=192.168.1.16 network=ens32 #关闭selinux setenforce sed -i 's/SELINUX=enforc ...

  9. 【RN - 基础】之React Native组件的生命周期

    下图描述了React Native中组件的生命周期: 从上图中可以看到,React Native组件的生命周期可以分为初始化阶段.存在阶段和销毁阶段. 实例化阶段 实例化阶段是React Native ...

  10. drf目录

    drf目录 1 web接口与restful规范 2 django中的restful规范 3 CBV请求分析 4 请求模块分析 5 响应模块分析 6 异常模块 7 解析模块 8 序列化类 9 视图组件 ...