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 < 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;

}

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 << Count<

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值