python分苹果问题_分苹果问题的C++和Python实现
很好玩的一个问题。话说小明的苹果怎么可能一模一样?
显然这并不是重点。重点在于抽象这个问题的方法。
如果从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实现相关推荐
- app分发源码_第三方苹果企业签名源码
第三方苹果企业签名源码 c6wlmsv 第三方苹果企业签名源码 ApplD需要一个易于描述的名称.应当这样讲,如果我们想要了解ios签名是什么意思,就先来谈谈苹果APP的上架问题.当前苹果的APP应用 ...
- python矩阵乘法分治_分治法实现矩阵乘法
#include #include #include #include using namespace std; int *InitMatrix(int row,int col);//初始化 void ...
- 苹果开发者_国外苹果企业开发者账户
国外苹果企业开发者账户 PG123hs6 国外苹果企业开发者账户 即便审批完毕后也不一定就代表着发布取得成功,很有可能还会继续挨打回再次递交,比较严重的会由于反复的发布被拒而造成苹果者封.科技是内测对 ...
- python正则表达式使用实例_正则表达式的基础知识,以及Python爬虫中的使用方法...
一.正则表达式 实际上爬虫一共就四个主要步骤: 明确目标(要知道你准备在哪个范围或者网站去搜索) 爬(将所有的网站内容全部爬下来) 取(去掉对我们没有用处的数据) 处理数据 我们在第上一篇文章中介绍的 ...
- python按enter退出_【cmd按任意键退出 python】
转Linux 下 Python 实现按任意键退出 某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时 ...
- python交流企鹅裙_神级程序员巧用python开发王者荣耀把妹神器,一路升级上王者!...
Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理 ...
- python 职场需求_职场必备:如何用Python提升未来竞争力?
今年很多人在问一个问题:到底什么才是抗风险能力? 稳定的工作?存款?理财? 有人预测:"到2030年,今天一半的工作岗位都将消失." 关于哪些工作最先消失,李开复提出过" ...
- 为什么说python是万能的_为什么说”人生苦短,我用python“
首先我们要说明的是本文不扯什么大道理,只是先介绍Python的背景,然后从实用的角度出发举一两个真实栗子. 这里写图片描述 首先要想了解要一门语言的好坏,或者为什么招程序员喜欢(卧槽,原来程序员喜欢不 ...
- python 进程生命周期_计算客户生命周期价值的python解决方案
python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...
- python批量命名教程_《自拍教程69》Python 批量重命名音频文件,AV专家必备!
本篇主要学习如何Python自定义模块并调用该模块,并重点介绍Python正则表达式的强大的文本处理能力. 案例故事:任何一款终端产品只要涉及音频输出,就肯定涉及音频的解码, 作为一名专业的AV (A ...
最新文章
- Docker与OpenStack集成实战
- 打破学习的玻璃墙_打破Google背后的创新深度学习
- mmall工程生成dao层的插件出错了出错了 自动生成mapper 的插件出错了
- TFS命令tf:undo(强制签入签出文件)
- Python常见数据结构整理,分享给你们
- vs2010跟vs2008比较增加了哪些功能
- bresenham算法_二维光栅图形的扫描:直线的DDA、Bresenham算法与圆的生成
- python在哪里写代码-python的代码在哪编写
- 前端vue实现PDF预览
- 一个佛系程序员的年终总结
- html水印生成pdf,如何在jsPDF中添加PDF生成水印?
- 枚举方法在swtch中的用法
- java 8 doc_java8 doc 中文
- 离人愁用计算机来弹,抖音计算机乐谱有哪些?计算机歌曲乐谱汇总
- 小白深度学习入坑指南
- jQuery插件开发全解析,jQuery.extend , (function($){ , $.fn.pluginName
- 大数据有哪些软件可以使用?
- 仿趣玩网五屏带标题的jQuery幻灯效果 分享
- 水位传感器c语言程序,简单水位报警器(水浸传感器)单片机源码
- 基于MiniSTM32的mpu6050学习笔记(一)
热门文章
- P3518 [POI2011]strongbox
- Chrome for Android AutoComplete地址栏地址自动补全功能调研和更新
- 计算机系男生横幅,男生节标语横幅
- android平台下OpenGL ES 3.0使用GLSurfaceView对相机Camera预览实时处理
- Stereo Vision-based Semantic 3D Object and Ego-motion Tracking for Autonomous Driving
- 实验三 迷宫游戏开发
- 无聊到能吓死一湾人的鬼畜代码
- f81沒有啟用配銷模組,全用INV的雜項處理方式處理,有以下管理要求
- USB转换芯片(用来做鼠标键盘)
- 渗透测试-burp suite实战