PHP实现预算约束下食品组合枚举功能的代码修正
PHP 食品采购预算可行组合枚举实现
基础规则确认
三类食品的包装、定价与输出对应关系如下:
- Worst(输出标识为worsten):单包售价5欧元,每包6个
- Hamburgers:单包售价10欧元,每包20个
- Frikandellen:单包售价15欧元,每包25个
实现逻辑
- 通过
readline()接收用户输入的采购预算,先做合法性校验,过滤非正整数的无效输入 - 分别计算单类商品在预算范围内可购买的最大包数,通过三层循环遍历所有可能的包数组合
- 逐组计算总采购成本,仅保留成本与预算完全匹配的可行方案
- 按购买包数换算每类食品的总个数,按要求的格式输出结果
修正后可直接运行的代码
<?php // 读取用户输入的预算 $budgetInput = readline("请输入采购总预算(单位:欧元):"); $totalBudget = (int)$budgetInput; if ($totalBudget <= 0) { exit("错误:预算必须为大于0的正整数\n"); } // 商品配置:单包价格、每包个数 $config = [ 'worsten' => ['pack_price' => 5, 'pack_count' => 6], 'hamburgers' => ['pack_price' => 10, 'pack_count' => 20], 'frikandellen' => ['pack_price' => 15, 'pack_count' => 25] ]; // 计算单类商品最大可购买包数 $maxWorstPack = intdiv($totalBudget, $config['worsten']['pack_price']); $maxHamburgerPack = intdiv($totalBudget, $config['hamburgers']['pack_price']); $maxFrikandelPack = intdiv($totalBudget, $config['frikandellen']['pack_price']); echo "预算{$totalBudget}欧元下的所有可行采购方案:\n"; // 遍历所有组合 for ($w = 0; $w <= $maxWorstPack; $w++) { for ($h = 0; $h <= $maxHamburgerPack; $h++) { for ($f = 0; $f <= $maxFrikandelPack; $f++) { $currentCost = $w * $config['worsten']['pack_price'] + $h * $config['hamburgers']['pack_price'] + $f * $config['frikandellen']['pack_price']; // 成本匹配预算时计算总个数并输出 if ($currentCost == $totalBudget) { $worstTotal = $w * $config['worsten']['pack_count']; $hamburgerTotal = $h * $config['hamburgers']['pack_count']; $frikandelTotal = $f * $config['frikandellen']['pack_count']; echo "• {$worstTotal} worsten, {$hamburgerTotal} hamburgers, {$frikandelTotal} frikandellen\n"; } } } } ?>
运行说明
- 脚本在CLI模式下运行,输入预算数值后会自动输出所有符合要求的组合
- 遍历从0包开始计数,支持某类食品不购买的场景
- 采用整数除法计算最大购买包数,避免浮点数运算导致的判断误差
- 如果需要支持预算有剩余的场景,把成本判断条件的
==改成<=即可
内容的提问来源于stack exchange,提问作者Faiz
相关产品推荐
相关产品推荐

