百钱买百鸡问题

int money = 100;
int count = 0;//计数器
           
int chickPrice = 3, roosterPrice = 5, littleChickPrice = 1;
int littleChickNum = money * littleChickPrice * 3;
int chickNum = 0, roosterNum = 0;
    
int surplus = 0;
while (littleChickNum >= 0)
{
    //首先确定买小鸡后剩余的钱
    surplus = money - (chickNum * chickPrice + roosterNum * roosterPrice + littleChickNum * littleChickPrice / 3);
    if (surplus / chickPrice > 0)  //买小鸡后剩余的钱如果够买一只以上的母鸡就进入这个分支
    {
        chickNum = surplus / chickPrice;
        while (chickNum >= 0)
        {
            int balance = surplus - (chickNum * chickPrice); //balance是买完小鸡和母鸡后剩余的钱
            roosterNum = balance / roosterPrice; //balance最多能买的公鸡数量
            //接下来进行两个判断
            if (chickNum * chickPrice + roosterNum * roosterPrice + littleChickNum * littleChickPrice / 3 == money) //是否满足刚好用够100元
            {
                if (chickNum + roosterNum + littleChickNum == 100) //是否满足鸡的数量之和为100
                {
                    Console.WriteLine("小鸡:" + littleChickNum + " 母鸡:" + chickNum + " 公鸡:" + roosterNum);
                    count++;
                }
            }
            chickNum--;
        }
        chickNum = 0; //每次结束内层循环后把母鸡和公鸡的数量归零,不然在计算下一次surplus的值的时候会出问题
        roosterNum = 0;
    }
    littleChickNum -= 3;//每次外层循环结束前让小鸡数量自减三个,因为小鸡是一元可以买三个
}
           

Console.WriteLine("一共" + count + "种买法");

Console.ReadKey();

百钱买百鸡问题_第1张图片

 整个程序的逻辑就是:

1.先假设100元全部买了小鸡,然后让小鸡数量每过一个循环就减少一个单位(这里是一元可以买三只小鸡所以每次循环减少三个)

2.然后在小鸡数量确定的情况下,用剩余的钱最多能买几只母鸡

3.接着需要让母鸡数量动态减少使得surplus里的值能分给公鸡的部分增多从而达到遍历每个情况的结果。

在外层循环里,可以认为小鸡与母鸡的数量是相对变化的,这时候不需要考虑公鸡的数量,而内层循环里则是母鸡与公鸡的数量相对变化,不需要考虑小鸡的数量,最后加上限制条件(100元,100只)进行选择就好了。

你可能感兴趣的:(学习)