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

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

如果从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. app分发源码_第三方苹果企业签名源码

    第三方苹果企业签名源码 c6wlmsv 第三方苹果企业签名源码 ApplD需要一个易于描述的名称.应当这样讲,如果我们想要了解ios签名是什么意思,就先来谈谈苹果APP的上架问题.当前苹果的APP应用 ...

  2. python矩阵乘法分治_分治法实现矩阵乘法

    #include #include #include #include using namespace std; int *InitMatrix(int row,int col);//初始化 void ...

  3. 苹果开发者_国外苹果企业开发者账户

    国外苹果企业开发者账户 PG123hs6 国外苹果企业开发者账户 即便审批完毕后也不一定就代表着发布取得成功,很有可能还会继续挨打回再次递交,比较严重的会由于反复的发布被拒而造成苹果者封.科技是内测对 ...

  4. python正则表达式使用实例_正则表达式的基础知识,以及Python爬虫中的使用方法...

    一.正则表达式 实际上爬虫一共就四个主要步骤: 明确目标(要知道你准备在哪个范围或者网站去搜索) 爬(将所有的网站内容全部爬下来) 取(去掉对我们没有用处的数据) 处理数据 我们在第上一篇文章中介绍的 ...

  5. python按enter退出_【cmd按任意键退出 python】

    转Linux 下 Python 实现按任意键退出 某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时 ...

  6. python交流企鹅裙_神级程序员巧用python开发王者荣耀把妹神器,一路升级上王者!...

    Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理 ...

  7. python 职场需求_职场必备:如何用Python提升未来竞争力?

    今年很多人在问一个问题:到底什么才是抗风险能力? 稳定的工作?存款?理财? 有人预测:"到2030年,今天一半的工作岗位都将消失." 关于哪些工作最先消失,李开复提出过" ...

  8. 为什么说python是万能的_为什么说”人生苦短,我用python“

    首先我们要说明的是本文不扯什么大道理,只是先介绍Python的背景,然后从实用的角度出发举一两个真实栗子. 这里写图片描述 首先要想了解要一门语言的好坏,或者为什么招程序员喜欢(卧槽,原来程序员喜欢不 ...

  9. python 进程生命周期_计算客户生命周期价值的python解决方案

    python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...

  10. python批量命名教程_《自拍教程69》Python 批量重命名音频文件,AV专家必备!

    本篇主要学习如何Python自定义模块并调用该模块,并重点介绍Python正则表达式的强大的文本处理能力. 案例故事:任何一款终端产品只要涉及音频输出,就肯定涉及音频的解码, 作为一名专业的AV (A ...

最新文章

  1. Docker与OpenStack集成实战
  2. 打破学习的玻璃墙_打破Google背后的创新深度学习
  3. mmall工程生成dao层的插件出错了出错了 自动生成mapper 的插件出错了
  4. TFS命令tf:undo(强制签入签出文件)
  5. Python常见数据结构整理,分享给你们
  6. vs2010跟vs2008比较增加了哪些功能
  7. bresenham算法_二维光栅图形的扫描:直线的DDA、Bresenham算法与圆的生成
  8. python在哪里写代码-python的代码在哪编写
  9. 前端vue实现PDF预览
  10. 一个佛系程序员的年终总结
  11. html水印生成pdf,如何在jsPDF中添加PDF生成水印?
  12. 枚举方法在swtch中的用法
  13. java 8 doc_java8 doc 中文
  14. 离人愁用计算机来弹,抖音计算机乐谱有哪些?计算机歌曲乐谱汇总
  15. 小白深度学习入坑指南
  16. jQuery插件开发全解析,jQuery.extend , (function($){ , $.fn.pluginName
  17. 大数据有哪些软件可以使用?
  18. 仿趣玩网五屏带标题的jQuery幻灯效果 分享
  19. 水位传感器c语言程序,简单水位报警器(水浸传感器)单片机源码
  20. 基于MiniSTM32的mpu6050学习笔记(一)

热门文章

  1. P3518 [POI2011]strongbox
  2. Chrome for Android AutoComplete地址栏地址自动补全功能调研和更新
  3. 计算机系男生横幅,男生节标语横幅
  4. android平台下OpenGL ES 3.0使用GLSurfaceView对相机Camera预览实时处理
  5. Stereo Vision-based Semantic 3D Object and Ego-motion Tracking for Autonomous Driving
  6. 实验三 迷宫游戏开发
  7. 无聊到能吓死一湾人的鬼畜代码
  8. f81沒有啟用配銷模組,全用INV的雜項處理方式處理,有以下管理要求
  9. USB转换芯片(用来做鼠标键盘)
  10. 渗透测试-burp suite实战