将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. maven打包记录1

    在需要打包的项目目录下找到pom.xml文件 (过程中可能遇到 :-Dmaven.multiModuleProjectDirectory system property is not set. Che ...

  2. Mybatis精讲(二)---生命周期

    目录 回顾 SqlSessionFactoryBuilder SqlSessionFactory openSessionFromDataSource Executor SqlSession Mappe ...

  3. nyoj 62-笨小熊(以对应数组中的ASC位 + 1)

    62-笨小熊 内存限制:64MB 时间限制:2000ms Special Judge: No accepted:15 submit:43 题目描述: 笨小熊的词汇量很小,所以每次做英语选择题的时候都很 ...

  4. mysql数据库E-R图

    学会绘制E-R图 绘制E-R图首先要了解什么是实体,什么是属性,什么是联系. 1.首先实体是指现实世界中具有区分其他事物的特征或属性与其他实体有联系的实体,针对于数据库中的表而言实体是指表中一行一行特 ...

  5. kafka connector 使用总结以及自定义connector开发

    Kafaka connect 是一种用于在Kafka和其他系统之间可扩展的.可靠的流式传输数据的工具.它使得能够快速定义将大量数据集合移入和移出Kafka的连接器变得简单.Kafka Connect可 ...

  6. 如何通过swoole加速laravel的问题?

    这篇文章主要介绍了关于如何使用swoole加速laravel,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 再来复习一下吧,导致 php 慢的各种因素中解析性语言的特性可以说是罪魁祸首 ...

  7. 菜鸟系列Fabric源码学习 — 区块同步

    Fabric 1.4 源码分析 区块同步 本文主要从源码层面介绍fabric peer同步区块过程,peer同步区块主要有2个过程: 1)peer组织的leader与orderer同步区块 2)pee ...

  8. 【2018寒假集训 Day2】【动态规划】回文字

    回文字(palin) 问题描述: 如果一个单词从前和从后读都是一样的,则称为回文字.如果一个单词不是回文字,则可以把它拆分成若干个回文字.编程求一个给定的字母序列,最多要分割成几部分,使每一部分都回文 ...

  9. Python常见字符串方法函数

    1.大小写转换 S.lower() S.upper() 前者将S字符串中所有大写字母转为小写,后者相反 S.title() S.capitalize() 前者返回S字符串中所有单词首字母大写且其他字母 ...

  10. ASP.NET Core 中的 ObjectPool 对象重用(一)

    前言 对象池是一种设计模式,一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象.池的对象可以从池中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁他,他是一种 ...