sicily. 放鸡蛋(输出情况总数+输出具体情况)


Description

M个同样的鸡蛋放在N个同样的篮子里,允许有的篮子空着不放,问共有多少种不同的放法?

511151是同一种分法。

Input

第一行是测试数据的数目t0 <= t <= 20)。

以下每行均包含二个整数MN,以空格分开。1<=MN<=10

Output

对输入的每组数据MN,用一行输出相应的K 

Sample Input
1
7 3
Sample Output
8


用递归。参考这位大神

#include<iostream>
using namespace std;

//传进鸡蛋的数量与篮子的数量返回放置鸡蛋方法的种数
int find_num_of_ways(int num_of_eggs, int num_of_baskets);

int main(){
	int t;
	cin >> t;
	while (t--){
		int num_of_eggs, num_of_baskets;
		cin >> num_of_eggs >> num_of_baskets;
		cout << find_num_of_ways(num_of_eggs, num_of_baskets) << endl;
	}

	return 0;
}

int find_num_of_ways(int num_of_eggs, int num_of_baskets) {
	//只有1个篮子或1个鸡蛋时只有1种放置方法
	if (num_of_baskets == 1 || num_of_eggs == 1)
		return 1;
	//篮子多余鸡蛋时等于每个篮子放一个鸡蛋的情况(1种)加上把鸡蛋放到比鸡蛋数量少1个篮子的情况数
	if (num_of_baskets >= num_of_eggs)
		return 1 + find_num_of_ways(num_of_eggs, num_of_eggs - 1);
	else
		//每个篮子放一个鸡蛋后剩下num_of_eggs-num_of_baskets个鸡蛋放到num_of_baskets个篮子里
		return find_num_of_ways(num_of_eggs - num_of_baskets, num_of_baskets)
		//不是全部篮子用上的情况
		+ find_num_of_ways(num_of_eggs, num_of_baskets - 1);
}


-----------------------------------------------------------------------------------------------------------

以上是求出了放鸡蛋情况的总数。那么怎样求出所有的具体情况呢?
可以参考整数划分的解法。整数划分实际上是将n个鸡蛋放入n个篮子中。
稍加修改就可以应用到这题里面。

#include<stdio.h>
#pragma warning(disable:4996)

int list[255];

void split(int n, int m, int max){
	int i;

	// 如果分割完毕
	if (n == 0){
		// 遍历输出数组
		for (i = 0; i < m; i++){
			printf("%d", list[i]);
		}
		for (; i < max; i++){  //  空“篮子”补上0
			printf("0");
		}
		printf("\n");

		return;
	}

	// 由大到小进行分割
	for (i = n; i >= 1; i--){
		// 如果未分割或当前分割的数字不大于上一个分割的数字
		if (m == 0 || i <= list[m - 1]){
			// 将分割的数字存入数组
			list[m] = i;
			// 如果m小于总的“篮子”数(m从0开始计数),则分割剩下的数字
			if (m < max) {
				split(n - i, m + 1, max);
			}
		}
	}
}

int main() {
	int T, n, max;
	scanf("%d", &T);  //  

	while (T--) {
		scanf("%d%d", &n, &max);  //  输入鸡蛋个数和篮子个数

		split(n, 0, max);
	}
	return 0;
}


测试样例:

测试样例











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值