将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. tensorflow中的学习率调整策略

    通常为了模型能更好的收敛,随着训练的进行,希望能够减小学习率,以使得模型能够更好地收敛,找到loss最低的那个点. tensorflow中提供了多种学习率的调整方式.在https://www.tens ...

  2. lqb 基础练习 01字串 (itoa)

    基础练习 01字串 时间限制:1.0s   内存限制:256.0MB     问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 00000 00001 0 ...

  3. W5500

    W5500 芯片是一款韩国全硬件TCP/IP协议栈以太网接口芯片,   最近发现我们国内也有和W5500 芯片一样芯片 介绍给大家 如下图 :

  4. 深入ObjC GCD中的dispatch group工作原理。

    本文是基于GCD的支持库libdispatch的源代码分析的结果或是用于作为源代码阅读的参考,尽量不帖代码,力求用UML图来说明工作流. 本文参考的源代码版本为v501.20.1,如有兴趣请自行到苹果 ...

  5. 程序员修神之路--kubernetes是微服务发展的必然产物

    菜菜哥,我昨天又请假出去面试了 战况如何呀? 多数面试题回答的还行,但是最后让我介绍微服务和kubernetes的时候,挂了 话说微服务和kubernetes内容确实挺多的 那你给我大体介绍一下呗 可 ...

  6. 转:MySQL中变量的定义和变量的赋值使用(转)

    MySQL中变量的定义和变量的赋值使用(转)   说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较 ...

  7. 【Linux系列】配置Centos 7的软件源(二)

    目的 本文主要介绍以下内容: 设置centos的国内软件源,默认源都是国外的下载软件超级麻烦. ssh登录 下载一个shell或者cmder ssh root@192.168.10.18 #上篇设置的 ...

  8. 解决failed to push some refs to 'git@github.com:TQBX/GIT-Github-.git'问题

    解决以下问题问题: git pull origin master --allow-unrelated-histories 进入vim界面->ESC->:wq 重复第一步->git p ...

  9. 折腾笔记-计蒜客T1167AC记

    查看原题 原题地址 思路: 判断回文+判断质数 初步代码: #include <bits/stdc++.h> using namespace std; bool prime(int n) ...

  10. BeanUtils.copyProperties()怎样去掉字段首尾的空格

    背景 下午三时许,笔者正戴着耳机听着歌开心的敲着bug,忽然听到办公室的吵架声,原来是ios开发和产品小姐姐吵起来了,为了一个车牌号的校验问题.起因是ios传的车牌号没有将字符串的首尾空格去掉,后端直 ...