C++配马问题

题目:有300匹马,驮300担货,大马驮4担,中马驮3担,两匹小马驮1担,问大中小马各多少匹,有多少组解。(要求大马、小马、中马的数量各不少于5匹,每匹马都得用上)。

无脑法:

for(d;d<=289;d++){
    for(z=5;z<=300-d;z++){
        for(x=6;x<=300-z-d;x++){
            if(x%2==0){
                if(d*4+z*3+(x/2)==300 &&d+z+x==300){
                    cout<<d<<" "<<z<<" "<<x<<endl;
                }
            }
        }
    }
}

现在重写一下:

由题意得,

大中小三种马数量和为300,驮300担

\begin{cases}x+y+z=300\\4x+3y+\dfrac{z}{2}=300\end{cases}

每种马至少5匹

\begin{cases}5\leq x\leq 75\\ 5\leq y\leq 100\\ 6\leq z\leq 150\end{cases}

因为x的上限最小,计算次数最少,所以把y,z写成x的函数

\begin{cases}y=60-\dfrac{7}{5}x\\ z=240+\dfrac{2}{5}x\end{cases}

由方程组知x是5的倍数,且有

60-\dfrac{7}{5}x\geq 5

所以

5\leq x\leq 35

所以该题有7个解,一行代码解决

for (int x = 5, y = 5, z = 6; x <= 35; x += 5){cout<<x<<" "<<60-(7*x)/5<<" "<<240+(2*x)/5<<endl;}

结果:

5 53 242
10 46 244
15 39 246
20 32 248
25 25 250
30 18 252
35 11 254

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值