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

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

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

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

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

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

于是我们开始递归计数:

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

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

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

C++ 实现算法(值得我自己练习和细品)#include "stdafx.h"

#include

int Count = 0;

using namespace std;

void printArr(int dishNum, int* arr){

for (int i = 0; i

for (int j = 0; j

cout <

cout <

}

cout <

}

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;

}

else

return;

}

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 <

delete[]a;

a = NULL;

return 0;

}

验证算法正确。

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

然后是用python誊写算法。誊写过程中的关键点:python没有引用的传递,取而代之的是全局列表。

for循环为迭代器。

全局列表需要初始化。

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

没有用面向对象,感觉怪怪的。应该创建个苹果分配器类啥的。#-*-coding:utf-8-*

def allocate(M,N,idx):

global a ,count

if idx==N-1:

if a[idx-1]>=M :

a[idx]=M

count+=1

print a

return

else:

return

else:

for i in reversed(range(0,M+1)):

if idx==0:

a[idx]=i

allocate(M-i,N,idx+1)

else:

if a[idx-1]>=i:

a[idx]=i

allocate(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=0

allocate(int(M),int(N),0)

print count

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

用python解决放苹果问题_分苹果问题的C++和Python实现相关推荐

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

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

  2. 高德python解决租房项目费用_高德API+Python解决租房问题

    项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时.项目由ekCit发 ...

  3. python 数组合并排重_并排深度学习:Julia vs Python

    python 数组合并排重 Julia could possibly be the biggest threat to Python. For a variety of applications, J ...

  4. python基础教程价格范围_价值18980元的968集Python教程,在此透露给大家!速度来拿哇...

    我是完全自学的,看完这条回答你就不用花钱学了.一千多的课程也就是基础课,并不会给你有多深入.如果要是学基础的话,看看下面的学习线路图以及相关的学习方法足够了.贴一个我之前自学的路径图和方法. 小白学P ...

  5. python模块cv2人脸识别_手把手教你使用OpenCV,Python和深度学习进行人脸识别

    使用OpenCV,Python和深度学习进行人脸识别 在本教程中,你将学习如何使用OpenCV,Python和深度学习进行面部识别.首先,我们将简要讨论基于深度学习的面部识别,包括"深度度量 ...

  6. python难度大的题_早看少被坑!Python 最难的问题

    超过十年以上,没有比解释器全局锁(GIL)让Python新手和专家更有挫折感或者更有好奇心. 未解决的问题 随处都是问题.难度大.耗时多肯定是其中一个问题.仅仅是尝试解决这个问题就会让人惊讶.之前是整 ...

  7. python手机端编程环境_移动端自动化测试解决方案(Appium + Python) - (1) 环境搭建...

    最近对iOS自动化测试做了一番探究,希望通过自动化测试更好的去提高公司项目的测试效率 .在网上找了很多的文章和相关资料,都因为时间比较久导致无法实现基本环境的搭建,我在这儿分享给大家分享我的实现过程. ...

  8. python做什么项目好_推荐两个牛逼的Python项目

    首先能问出这种问题的一定没好好看我之前写的这篇文章:丧心病狂的Github技巧,你要是学会了这篇文章的技巧,我相信你肯定不会再问我怎么找项目了. 但是看着有一两千的人给我的留言点赞,都想要Python ...

  9. python下载之后无法启动_安装后启动时,适用于Python的Eric IDE崩溃

    On Windows 7 I successfully installed Python 3.73 and then installed Eric 6, the Python IDE. 安装似乎已成功 ...

  10. python必读5本书籍_免费下载!5本从Python入手机器学习的必备电子书!(附链接)...

    大数据文摘授权转载自数据派THU 作者:Richard Gall 编译:车前子.丁楠雅 今天,机器学习已成为软件工程所有领域中最重要的发展趋势之一.这门技术不再局限于研究者和数据分析者,从网络安全到网 ...

最新文章

  1. 计算距离torch.nn.PairwiseDistance
  2. Linux运维之批量下载指定网站的100个图片文件,并找出大于200KB的文件
  3. ccform 表单的单据打印
  4. Android Activity标签属性
  5. 0 改造,让单体/微服务应用成为 Serverless Application
  6. ajax代码原理,关于Ajax的原理以及代码封装详解
  7. sdk manager的列表怎么消失了_腾讯安全SDK的Dll Dump研究
  8. Q72:渲染方程(Rendering Equation)
  9. linux 编写java代码
  10. Ant的使用 - 简单介绍
  11. python得安什么安装包_初学 Python 需要安装哪些软件?
  12. C++编程语言中const关键字介绍
  13. 剖析HotSpot的Launcher
  14. 区块链在切实改变世界的35个让人惊艳的实例数据库
  15. pdf文件插入电子签名
  16. 机器人工作空间解析分析
  17. 使用 npm 打包项目
  18. Android安全攻防战,反编译与混淆技术完全解析(上)
  19. 网络攻防 横向移动_网络安全101的数据分析:检测横向移动
  20. MyEclipse+Tomcat+Java+MySQL实现企业员工信息管理系统

热门文章

  1. python之二进制
  2. 全年营业额怎么计算_年度利润总额如何计算
  3. 解决-系统策略禁止安装此设备,请与系统管理员联系
  4. webp的js插件_网页及CSS使用JS脚本加载webP图片
  5. 全球及中国毛巾产品市场盈利前景与供需调查分析报告2022版
  6. linux eof 用法,Linux下EOF 用法
  7. 付费版百度指数 就是这么坑爹
  8. 单片机流水灯工作原理
  9. RMS TO EAP通过MQTT简单实现
  10. Base理论是什么?之前也聊到过CAP理论