【编程题分享·解题思路】周老师现有m个苹果,现要将苹果完全分配给不定人数的小朋友们,每个小朋友的苹果数均不相同。这样的分配可能有多种方式。

【问题描述】周老师现有m个苹果,现要将苹果完全分配给不定人数的小朋友们,每个小朋友的苹果数均不相同。这样的分配可能有多种方式。例如,总数m为6个苹果时,周老师找到了四种不同的分配方式,分别为6=6,6=5+1,6=4+2, 6=3+2+1。请找出当m个苹果时,周老师的苹果分配方式是多少种。

【输入形式】
输入一个正整数 m表示周老师拥有的苹果总数

【输出形式】
输出一个整数,表示周老师的苹果有几种分配方式

【样例输入】
6
【样例输出】
4
解题思路:观察以下数字组合
1,2,3
1,5
2,4
6
它们的共同点在于两两不相同,且加起来等于6.
因此我们可以引入变量,每次要拿走的苹果数从1递增到苹果总数,这样既可以保证数字两两不相同,又可以保证组合只出现一次。
这道题并没有规定苹果要分配给多少人,因此用传统的循环迭代的方式难以进行。用递归可以简单很多。

函数参数:苹果总数和当次拿走的苹果数量。
递归结束条件:苹果总数小于或等于当次拿走的苹果数量。
递归公式:如果这次拿走,下次多拿走一个时剩余苹果数目的分配方案 + 如果这次不拿走,下次多拿走一个时苹果数目的分配方案。
这样可以保证函数返回值为所有分配值都大于或等于拿走苹果数量的方案数。
注意:递归题目的解答一定是站在一个层面的递归内进行思考,不要站在整体思考。那样做没有意义也废脑筋。这道题成功的让我明白了这个观点。

#include<bits/stdc++.h>
using namespace std;
int fenpei(int a,int b)
{
	int c;
	if(a<b)
	{
		c=0;
	}
	else if(a==b)
	{
		c=1;
	}
	else
	{
		c=fenpei(a,b+1)+fenpei(a-b,b+1);
	}
	return c;
}
int main()
{
	int m=0;
	cin>>m;
	cout<<fenpei(m,1);
	return 0;
}

其实这是我讨论课上的内容,我把它放在了博客里,如果这篇文章帮到了你,请点个赞让我知道吧,哈哈。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您可以使用 Java 的多线程技术来实这个模拟场景。首先,您需要定义一个小朋友对象和一个老师对象,然后将 50 个小朋友随机分配给三个老师。 下面是一个基本的示例代码: ```java import java.util.ArrayList; import java.util.List; import java.util.Random; public class TeacherAndChildrenDemo { public static void main(String[] args) { List<Teacher> teachers = new ArrayList<>(); teachers.add(new Teacher("Teacher A")); teachers.add(new Teacher("Teacher B")); teachers.add(new Teacher("Teacher C")); List<Child> children = new ArrayList<>(); for (int i = 1; i <= 50; i++) { children.add(new Child("Child " + i)); } Random random = new Random(); for (Child child : children) { int index = random.nextInt(3); teachers.get(index).addApple(child); } for (Teacher teacher : teachers) { teacher.start(); } } static class Child { private String name; private int appleCount; public Child(String name) { this.name = name; } public String getName() { return name; } public int getAppleCount() { return appleCount; } public void addApple() { appleCount++; } } static class Teacher extends Thread { private String name; private List<Child> children = new ArrayList<>(); public Teacher(String name) { this.name = name; } public String getName() { return name; } public void addApple(Child child) { children.add(child); } @Override public void run() { for (Child child : children) { System.out.println(getName() + " gives an apple to " + child.getName()); child.addApple(); } } } } ``` 在上面的代码中,我们创建了三个老师和 50 个小朋友,然后随机分配每个小朋友给其中的一个老师。接着,我们启动每个老师的线程,让他们发苹果给自己负责的小朋友。 当一个老师线程运行时,它会遍历自己负责的所有小朋友,并给他们发苹果。每个小朋友都有一个 `addApple()` 方法来增加自己的苹果数量。 这个示例代码只是一个基本的模拟,您可以根据自己的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值