很好玩的一个问题。话说小明的苹果怎么可能一模一样?

显然这并不是重点。重点在于抽象这个问题的方法。

如果从M个苹果,拿出N个苹果,问有几种可能性,很明显这是典型的组合问题;

combination algabra;

如果把M个苹果等分成N份。显然只有1种可能。

把苹果分成N堆,求可能性,我一时半会想不出什么数学模型。自然而然,想到了数学方法:迭代逼近和递归。

题目额外说明,1,3,1 和1,1,3算同一种分法。其分发可能等价于将苹果递减或者递增排列。

于是我们开始递归计数:

递归操作:遍历M~0,如果存在M比数组之前的元素小,说明这是递减情况下的最大可能,就给新的元素赋值M,并且为剩下的元素进行递归操作。

递归退出条件: 数组最后一位也完成赋值(剩下的元素正好小于等于之前的数)。

递归退出操作: 计数器加一。如果愿意,可以输出此时的数组。

C++ 实现算法(值得我自己练习和细品)

#include "stdafx.h"
#include <iostream>int Count = 0;
using namespace std;
void printArr(int dishNum, int* arr){for (int i = 0; i < dishNum; i++){for (int j = 0; j < arr[i]; j++)cout << "(vIv)";cout << "     ";}cout << endl;
}
void allocation(int appleNumLeft, int dishNum, int idx, int* arr){if (idx == (dishNum - 1)){if (arr[idx - 1] >= appleNumLeft){arr[idx] = appleNumLeft;Count++;printArr(dishNum, arr);return;}elsereturn;}else{for (int j = appleNumLeft; j >= 0; j--){if (idx == 0){arr[idx] = j;allocation(appleNumLeft - j, dishNum, idx + 1, arr);}else{if (arr[idx - 1] >= j){arr[idx] = j;allocation(appleNumLeft - j, dishNum, idx + 1, arr);}}}}}
int _tmain(int argc, _TCHAR* argv[])
{int M, N;cin >> M >> N;int *a = new int[N];allocation(M, N, 0, a);cout << Count<<endl;delete[]a;a = NULL;return 0;
}

验证算法正确。

每递归一层,递归函数中的循环缩短一层。直到到达最后一遍。如果不存在最小值,则返回而不累加计数器。

然后是用python誊写算法。誊写过程中的关键点:

  1. python没有引用的传递,取而代之的是全局列表。

  2. for循环为迭代器。

  3. 全局列表需要初始化。

  4. 由于可以直接print列表,省去了一个print函数(所以没有打印苹果T_T)

  5. 没有用面向对象,感觉怪怪的。应该创建个苹果分配器类啥的。

#-*-coding:utf-8-*
def allocate(M,N,idx):global a ,countif idx==N-1:if a[idx-1]>=M :a[idx]=Mcount+=1print areturnelse:returnelse:for i in reversed(range(0,M+1)):if idx==0:a[idx]=iallocate(M-i,N,idx+1)else:if a[idx-1]>=i:a[idx]=iallocate(M-i,N,idx+1)
if __name__=='__main__':M,N=raw_input("请输入苹果数和盘子数,并且用空格隔开\n").strip().split()a=[]for i in range(0,int(N)):a.append(0)count=0allocate(int(M),int(N),0)print count

两段代码的视觉简洁度的区别非常明显。python天生具有好的可阅读性,而且编写便捷度也不赖(缩进比花括号好输入多了。),代码短了近一半,也许对于ROP不友好:p (ROP=Resume Oriented Programming)

转载于:https://blog.51cto.com/raevo/1770491

分苹果问题的C++和Python实现相关推荐

  1. python分苹果问题_分苹果问题的C++和Python实现

    很好玩的一个问题.话说小明的苹果怎么可能一模一样? 显然这并不是重点.重点在于抽象这个问题的方法. 如果从M个苹果,拿出N个苹果,问有几种可能性,很明显这是典型的组合问题: 如果把M个苹果等分成N份. ...

  2. python分苹果问题_蓝桥杯--算法提高--VIP--分苹果题目(差分数组)

    1. 问题描述: 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1..N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果. 最后老师想知道每个小朋 ...

  3. python【蓝桥杯vip练习题库】ADV-183分苹果(差分数组 离线区间)

    试题 算法提高 分苹果 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1-N.有M个老师,每次第i个老师会给第Li个到第Ri个 ...

  4. 小学奥数 7826 分苹果 python

    http://noi.openjudge.cn/math/7826/ """ 小学奥数 7826 分苹果 http://noi.openjudge.cn/math/782 ...

  5. Python实现分苹果(递归)

    目录 题目描述 输入/输出描述 题目分析 代码展示 传送门 题目描述 M个同样的苹果分在N个同样的篮子里,允许有篮子空着不放,求一共有多少种不同的分法. 说明,3,1,1和1,3,1是一种分法:篮子可 ...

  6. [蓝桥杯][算法提高VIP]分苹果(差分||树状数组)

    题目描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1-N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果. 最后老师想知道每个小朋友有多少苹 ...

  7. java 蓝桥杯算法训练 猴子分苹果(题解)

    试题 算法训练 猴子分苹果 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些 ...

  8. POJ NOI MATH-7826 分苹果

    问题链接:POJ NOI MATH-7826 分苹果. 总时间限制: 1000ms 内存限制: 65536kB 描述 把一堆苹果分给n个小朋友,要使每个人都能拿到苹果,而且每个人拿到的苹果数都不同的话 ...

  9. Java实现 蓝桥杯VIP 算法提高 分苹果

    算法提高 分苹果 时间限制:1.0s 内存限制:256.0MB 问题描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1-N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li ...

最新文章

  1. 微软为华为定制了一个“烂笔头小冰”,让人想起了老罗的“闪念胶囊”
  2. tof摄像头手势识别_行业深度光学行业研究:CIS、光学元件、指纹识别、镜头模组...
  3. 切换账户、切换命令行和图形界面
  4. volatile类型的数据
  5. 5G NR 随机接入过程(1)
  6. html编辑器不支持自定义样式,百度编辑器自定义按钮样式问题(写在cssRules不起做用)?...
  7. 机器学习:算法模型:决策树
  8. 百度前端学院参考答案:第二十五天到第二十七天 倒数开始 滴答滴 滴答滴(2)...
  9. 快速设置XMind中的设置联系
  10. 实战 | Element UI 父子组件传值与事件绑定(正向)
  11. string与wstring互转
  12. python3安装包是说解压数据出错怎么办_无法修复“zipimport.zipimporter错误:无法解压缩数据;键入python3.6时zlib不可用获取pip.py...
  13. python名称空间_python基础:名称空间与作用域
  14. Vue小案例 之 商品管理------添加商品
  15. 将base64格式的图片下载到本地
  16. 写给非网工的CCNA教程(8)跨LAN的通信
  17. 搭建 Ubuntu 可视化界面
  18. 谈谈堆排序,大顶堆,小顶堆
  19. EDVR和FastDVD
  20. iOS 修改系统返回键

热门文章

  1. final修饰的变量是引用不能改变还是引用的对象不能改变
  2. mysql 设置表空间位置_如何修改表空间数据文件路径
  3. 太阳花图片_6种漂亮的花,种子已经成熟,别忘采摘种子,来年再播种
  4. bfgs算法matlab程序,BFGS优化算法及应用实例.docx
  5. java中tomcat检测_eclipse+tomcat测试JSP
  6. 5菜鸟教程_XPLANE10菜鸟基础教程系列 飞机、机场以及天气的设置
  7. 东软村医管理平台_软件定义汽车“性感”吗?东软睿驰有自己的答案
  8. directx修复工具win7_教你安装双系统,win7+win10
  9. HX711电子秤专用转换芯片读取MCU模块
  10. STC8K28步进电机ULC2003触发器