N个人都不坐自己位置的情况有几种

* 问题描述:n个人每个人都有自己的位置,问每个人都不坐自己的位置有几种情况
* 思路很简单:递归
* 第一个人可以做其他n-1个位置,当第一个人做每一个位置,比如说第一个人坐2号位置和3号位置的情况是一样多的。
* 然后当第一个人坐2号位置,剩下的情况和原问题并不等价
* 因为原问题每个人都有自己的位置,但是现在子问题2号没有自己的位置,只有多了一个1号位置
* 我们暂时把1号位置认为就是2号自己的位置,不能做的,那么子问题和原问题一样了,子问题是f(n-1)
* 但是事实上2号是可以坐1号位置的,所以我们要再添加一种情况,就是2号坐在1号位置上的情况,
* 它是一个更小的子问题,就是f(n-2)
package DynamicAndRecursive;

public class NN {
    /**
     * 问题描述:n个人每个人都有自己的位置,问每个人都不坐自己的位置有几种情况
     * 思路很简单:递归
     * 第一个人可以做其他n-1个位置,当第一个人做每一个位置,比如说第一个人坐2号位置和3号位置的情况是一样多的。
     * 然后当第一个人坐2号位置,剩下的情况和原问题并不等价
     * 因为原问题每个人都有自己的位置,但是现在子问题2号没有自己的位置,只有多了一个1号位置
     * 我们暂时把1号位置认为就是2号自己的位置,不能做的,那么子问题和原问题一样了,子问题是f(n-1)
     * 但是事实上2号是可以坐1号位置的,所以我们要再添加一种情况,就是2号坐在1号位置上的情况,
     * 它是一个更小的子问题,就是f(n-2)
     */
    public static int nn(int n){
        if(n == 1){
            return 0;
        };
        if(n == 2){
            return 1;
        }
        return (nn(n - 1) + nn(n - 2)) * (n - 1);

    }
    public static void main(String[] args){
        System.out.print(nn(4));
    }
}

 

在C语言中,计算将n个苹果分给k个人,每人都分到至少一个苹果的同分法数,可以使用组合数学中的“隔板法”(也叫“Stirling数的第二类”)。这个情况可以用斯特林数的第二类表示为S(n, k)。公式为: S(n, k) = (1/k!) * Σ [m^(n-m)] * (-1)^(m+1), 其中m从0到k-1。 其中Σ表示求和,m^(n-m)是从n-m个位置选择m个插入隔板的位置,(1/k!)是对所有可能的隔板顺序进行调整的因子,(-1)^(m+1)用于改变每个组合的符号以便形成递归序列。 由于循环同分法视为同一种,实际应用中通常只需对k取值范围内的S(n, k)计数,因为当k > n/k时,会有新的分配方案(比如能把7个苹果分给3个人每人至少1个)。 如果你需要编写代码来计算这个问题,那会涉及到一些循环和递归来计算斯特林数。这是一个复杂的任务,下面是一个简单的递归算法示例: ```c #include <stdio.h> unsigned long stirling_second(int n, int k) { if (k == 1 || n == k) return 1; // base cases else return (n - 1) * stirling_second(n - 1, k - 1) + stirling_second(n - 1, k); // recursive call } int main() { int n = 5, k; printf("Total ways to distribute %d apples among %d people with at least one per person: ", n, k); for (k = 2; k <= n; ++k) { unsigned long count = stirling_second(n, k); printf("%lu (k = %d), ", count, k); } return 0; } ``` 请记得替换`n`为你想要的具体苹果数。运行此程序将显示同k下总的分法数目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值