C#如何为100元买100只动物问题代码添加已检查组合总数统计
问题分析
你只需要在现有代码基础上新增一个计数器变量,每次检查一个采购组合时累加计数,全部检查完成后输出总数即可。如果要匹配你给出的期望输出里的1030301次检查计数,需要把原有做了剪枝优化的双层循环改成三层全量遍历所有可能的动物数量组合。
修改后完全匹配期望输出的代码
using System; namespace riddle { class Program { static void Main(string[] args) { int priceSheep = 8; int priceChicken = 3; float priceRabbit = 0.5F; // 新增计数器变量 long checkCount = 0; // 三层全遍历所有可能的动物数量,匹配期望的检查次数 for (int sheep = 0; sheep <= 100; ++sheep) { for (int chicken = 0; chicken <= 100; ++chicken) { for (int rabbit = 0; rabbit <= 100; ++rabbit) { checkCount++; // 同时满足总数量100、总花费100的条件才输出组合 if (sheep + chicken + rabbit == 100 && priceSheep * sheep + priceChicken * chicken + priceRabbit * rabbit == 100) { Console.WriteLine($"{sheep} sheeps {chicken} chickens {rabbit} rabbits"); } } } } // 最后输出总检查次数 Console.WriteLine($"{checkCount} combinations checked"); } } }
保留原有剪枝逻辑的优化修改方案
如果你不需要全量遍历统计,只想统计实际需要检查的有效组合数,可以用这个版本,运行效率更高,最终统计的检查次数为234:
using System; namespace riddle { class Program { static void Main(string[] args) { int priceSheep = 8; int priceChicken = 3; float priceRabbit = 0.5F; // 新增计数器变量 int checkCount = 0; for (int i = 0; i <= 100 / priceSheep; ++i) { for (int j = 0; j <= ((100 - i * priceSheep) / priceChicken); ++j) { checkCount++; int money = (100 - priceSheep * i - priceChicken * j); if (priceRabbit * (100 - i - j) == money) { Console.WriteLine(i + " " + "sheeps" + " " + j + " " + "chickens" + " " + (100 - i - j) + " " + "rabbits"); } } } Console.WriteLine($"{checkCount} combinations checked"); } } }
内容的提问来源于stack exchange,提问作者Mindo
相关产品推荐
相关产品推荐

