C语言穷举法求解:36块砖,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?

求解的问题描述:36块砖,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?

求解思路:用for循环嵌套3层,定义3个变量:i,j,k,分别代表男,女和小孩。每层循环最大数都是砖的总数即可,最最内层的for循环再用if条件判断语句实现男搬多少砖+女搬多少砖+小孩搬多少砖=砖的总数。

代码如下:

代码方案(一):

#include<stdio.h>
int main()
{
int i,j,k;
for(i=1;i<=36;i++){
    for(j=1;j<=36;j++){
        for(k=1;k<=36;k++){
        
        if(((4*i+3*j+0.5*k)==36))printf("男的有%d个,女的有%d个,小孩有%d个。\n",i,j,k);
    }
}
}
}

代码运行结果截图:

代码方案(二):

#include<stdio.h>
int main()
{
int i,j,k;
for(i=0;i<35;i++){
    for(j=0;j<35;j++){
        for(k=0;k<35;k++){
        
        if(((4*i+3*j+0.5*k)==36))printf("男的有%d个,女的有%d个,小孩有%d个。\n",i,j,k);
    }
}
}
}

代码运行结果截图:

完善代码(主要是统计出总的搬砖方案个数,即加入统计方案个数功能):

#include<stdio.h>
int main()
{
int i,j,k;
int b=0;
for(i=1;i<=36;i++){
    for(j=1;j<=36;j++){
        for(k=1;k<=36;k++){      
        if(((4*i+3*j+0.5*k)==36)){
        printf("男的搬砖的有%d个,女的搬砖的有%d个,小孩子搬砖的有%d个。\n",i,j,k);
        b=b+1;    
    }    
    }  
}
}
          printf("以上搬砖方案共有:%d种\n",b);
}

完善后的代码运行结果截图:

 

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 这道题可以用穷举来解决。我们可以从开始,每次增加男、女、小孩的数量,直到找到符合条件的解。 假设男的数量为x,女的数量为y,小孩的数量为z,那么我们可以列出以下方程: 4x + 3y + z/2 = 36 其中z/2表示两个小孩1,所以z必须是偶数。 我们可以用三重循环来穷举x、y、z的值,判断是否符合方程。具体代码如下: for x in range(, 10): for y in range(, 12): for z in range(, 72, 2): if 4*x + 3*y + z/2 == 36: print("男:{},女:{},小孩:{}".format(x, y, z/2)) 运行代码后,我们可以得到以下结果: 男:,女:12,小孩:. 男:1,女:9,小孩:2. 男:2,女:6,小孩:4. 男:3,女:3,小孩:6. 男:4,女:,小孩:8. 因为男、女、小孩的数量都必须是整数,所以小孩的数量必须是偶数。根据结果,我们可以得出男、女、小孩的数量分别为3、3、6。 ### 回答2: 这是一道经典的穷举题。我们可以通过列出所有可能的情况来找到答案。 首先,我们可以确定男块数量必须是4的倍数,因为每个男人都要4块。同时,女块数量必须是3的倍数,因为每个女人都要3块小孩块数量是1,所以小孩的数量必须是剩余块的数量。 我们可以像下面这样列出男、女、小孩的数量和每个人块数量: 男 女 小孩 块数量 0 0 36 36 0 3 33 36 0 6 30 36 0 9 27 36 ... 8 2 26 36 8 5 23 36 ... 我们可以在不断地尝试下一种情况的过程中找到符合条件的解。在这个例子中,我们总共要列出36 x 36 x 36种可能的组合。由于每一种情况都要计算每个人块数量,所以这种方并不是很高效。 另外一种方是从限制条件入手,通过计算满足条件的男、女、小孩人数来确定答案。例如,每个男人4块,每个女人3块,所以块数量必须是4和3的公倍数,即12、24、36。同时,小孩1块,因此剩下的块数量必须是小孩数量的整数倍。 综上所述,我们可以通过穷举来解决这道题,但是要计算大量的组合,效率不高。更好的方是从限制条件着手,通过计算符合条件的人数来确定答案。 ### 回答3: 首先,我们可以把题简化为只有男女两种人的情况。假设有 $m$ 个男人和 $n$ 个女人,那么根据题意可以列出以下方程: $$4m + 3n = 36$$ 其中 $4m$ 表示男人数,$3n$ 表示女人数。解这个方程可以得到: $$m = 9 - \frac{3}{4}n$$ 因为男人和女人的数量必须是整数,所以 $n$ 必须是 4 的倍数(因为 $m$ 是整数)。此外,根据题意,在男女都之后还会剩下两个小孩,因此我们必须把这两个留给小孩。 现在我们来考虑如何让小孩这两个。显然,每个小孩都必须一块,因此要有两个小孩。假设这两个小孩一开始是和女人一起的,那么女人的数量就变成了 $n-2$。此时男人和女人的数量为: $$4m + 3(n-2) = 4m + 3n - 6$$ 因为这个数量必须是 34(36 减去两个小孩)的倍数,所以有: $$4m + 3n - 6 = 34k$$ 其中 $k$ 是某个整数。我们将解这个方程: $$\begin{aligned}4m + 3n &= 34k + 6\\4m + 3n &= 34k + 10 - 4\\m &= 8 - \frac{3}{4}n + \frac{1}{4}k\end{aligned}$$ 因为 $m$ 必须是整数,所以 $n$、$k$ 必须同时是 4 的倍数。我们可以列出 $4n+4k=28$,得到 $n+k=7$。因此 $n=4$,$k=3$,$m=6$。这就是男、女、小孩的数量,分别是 6、16、2。男人 6×4=24 块,女人要 16×3=48 块,两个小孩 2 块,总共刚好是 36 块

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值