三只小猪
本题我们可以定义一个二维数组a[猪的数量][房子数量]来代表不同猪的个数和不同房子数量情况下的方案数量
先考虑比较简单的几种情况吧,房子数量大于猪的数量,那么 方案数就是0;房子数量等与猪的数量,那么方案数就是1.
最后就是猪的数量大于房子数量,这就要开始体现递归的思想了,很明显直接用排列组合或者其他方法是算不出来的,那我们就要思考是不是和前面的情况(猪少一只)有关系了
其实a[i][j]有两种情况:
(1)多出来一只猪和其他的猪一起睡,也就是a[i-1][j] *j(j个房子里面选一个)。
(2)多出来一只猪自己睡一个房子,也就是a[i-1][j-1]。
那么递归式其实已经很明显了,也就是a[i][j]=a[i-1][j] *j+a[i-1][j-1]。
具体举例一下,由题目可以知道a[3][2]=3,那我们要是想知道a[4][2]也就是多了一只猪的情况呢。
这只多出来的猪,我们可以进行以下两种情况的设想。
1、这只猪睡一个房子,也就是其他三头猪也睡一个房子,那么就有a[3][1]种情况(1种)。
2、这只猪和另外几头猪一起睡,那我们先前知道a[3][2]有3种情况,那么这头猪每种情况有两个房子可以选,也就是有a[3][2]* 2种情况(6种)。
所以合起来就有七种。
总结一下也就是a[猪的数量][房子数量]=a[猪的数量-1][房子数量-1](多出来的猪一只睡一个房子)+a[猪的数量-1][房子数量]* 房子数量(和其他猪一起睡)。所以我们可以写出已知情况,也就是猪和房子数量较少时的情况,再由这个递推式一步一步把所有情况都推出来。
还有就是如果是多了一个房子呢,其实我们不需要考虑,因为我们看这个递归式a[猪的数量][房子数量]=a[猪的数量-1][房子数量-1]+a[猪的数量-1][房子数量]* 房子数量,发现是可以由房子少的推到房子多的情况,所以当我们只考虑猪多一只的情况时,房子也在逐渐变多。
点击查看代码
#include <stdio.h>
#include<string.h>
long long a[22][22];
long long zhu(int n,int m)
{
a[2][1] = 1;//将已知的情况列出来,这样就可以通过递归推出下面的
a[3][1] = 1;
a[3][2] = 3;
a[4][2] = 7;
a[4][1] = 1;
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
if (i == j)//猪和房子数量一样多的情况
{
a[i][j] = 1;
}
else if (i < j)//猪的数量小于房子
{
a[i][j] = 0;
}
else
{
a[i][j] = a[i - 1][j] * j + a[i-1][j - 1];
}
}
}
return a[n][m];
}
int main()
{
int n, m,i,j;
long long x;
while (scanf("%d %d", &n, &m) != EOF)
{
memset(a, 0, sizeof(a));
x = zhu(n, m);
printf("%lld\n", x);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现