用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实现相关推荐
- python分苹果问题_分苹果问题的C++和Python实现
很好玩的一个问题.话说小明的苹果怎么可能一模一样? 显然这并不是重点.重点在于抽象这个问题的方法. 如果从M个苹果,拿出N个苹果,问有几种可能性,很明显这是典型的组合问题: 如果把M个苹果等分成N份. ...
- 高德python解决租房项目费用_高德API+Python解决租房问题
项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时.项目由ekCit发 ...
- python 数组合并排重_并排深度学习:Julia vs Python
python 数组合并排重 Julia could possibly be the biggest threat to Python. For a variety of applications, J ...
- python基础教程价格范围_价值18980元的968集Python教程,在此透露给大家!速度来拿哇...
我是完全自学的,看完这条回答你就不用花钱学了.一千多的课程也就是基础课,并不会给你有多深入.如果要是学基础的话,看看下面的学习线路图以及相关的学习方法足够了.贴一个我之前自学的路径图和方法. 小白学P ...
- python模块cv2人脸识别_手把手教你使用OpenCV,Python和深度学习进行人脸识别
使用OpenCV,Python和深度学习进行人脸识别 在本教程中,你将学习如何使用OpenCV,Python和深度学习进行面部识别.首先,我们将简要讨论基于深度学习的面部识别,包括"深度度量 ...
- python难度大的题_早看少被坑!Python 最难的问题
超过十年以上,没有比解释器全局锁(GIL)让Python新手和专家更有挫折感或者更有好奇心. 未解决的问题 随处都是问题.难度大.耗时多肯定是其中一个问题.仅仅是尝试解决这个问题就会让人惊讶.之前是整 ...
- python手机端编程环境_移动端自动化测试解决方案(Appium + Python) - (1) 环境搭建...
最近对iOS自动化测试做了一番探究,希望通过自动化测试更好的去提高公司项目的测试效率 .在网上找了很多的文章和相关资料,都因为时间比较久导致无法实现基本环境的搭建,我在这儿分享给大家分享我的实现过程. ...
- python做什么项目好_推荐两个牛逼的Python项目
首先能问出这种问题的一定没好好看我之前写的这篇文章:丧心病狂的Github技巧,你要是学会了这篇文章的技巧,我相信你肯定不会再问我怎么找项目了. 但是看着有一两千的人给我的留言点赞,都想要Python ...
- python下载之后无法启动_安装后启动时,适用于Python的Eric IDE崩溃
On Windows 7 I successfully installed Python 3.73 and then installed Eric 6, the Python IDE. 安装似乎已成功 ...
- python必读5本书籍_免费下载!5本从Python入手机器学习的必备电子书!(附链接)...
大数据文摘授权转载自数据派THU 作者:Richard Gall 编译:车前子.丁楠雅 今天,机器学习已成为软件工程所有领域中最重要的发展趋势之一.这门技术不再局限于研究者和数据分析者,从网络安全到网 ...
最新文章
- 计算距离torch.nn.PairwiseDistance
- Linux运维之批量下载指定网站的100个图片文件,并找出大于200KB的文件
- ccform 表单的单据打印
- Android Activity标签属性
- 0 改造,让单体/微服务应用成为 Serverless Application
- ajax代码原理,关于Ajax的原理以及代码封装详解
- sdk manager的列表怎么消失了_腾讯安全SDK的Dll Dump研究
- Q72:渲染方程(Rendering Equation)
- linux 编写java代码
- Ant的使用 - 简单介绍
- python得安什么安装包_初学 Python 需要安装哪些软件?
- C++编程语言中const关键字介绍
- 剖析HotSpot的Launcher
- 区块链在切实改变世界的35个让人惊艳的实例数据库
- pdf文件插入电子签名
- 机器人工作空间解析分析
- 使用 npm 打包项目
- Android安全攻防战,反编译与混淆技术完全解析(上)
- 网络攻防 横向移动_网络安全101的数据分析:检测横向移动
- MyEclipse+Tomcat+Java+MySQL实现企业员工信息管理系统