PHP 实现预算约束下的食品组合枚举(支持多品类数量换算)

梦瑶姑娘_3615

梦瑶姑娘_3615

2026-07-24

267人浏览

原创

PHP 实现预算约束下的食品组合枚举(支持多品类数量换算)

本文介绍如何在给定预算下,枚举所有满足价格约束的食品包组合方案,并按实际单件数量(如6根香肠/包、20个汉堡/包)输出可读结果,避免暴力全排列,采用高效递增迭代策略。

本文介绍如何在给定预算下,枚举所有满足价格约束的食品包组合方案,并按实际单件数量(如6根香肠/包、20个汉堡/包)输出可读结果,避免暴力全排列,采用高效递增迭代策略。

要解决“在固定预算内找出所有可行食品采购组合”这一问题,核心不是排列价格(如 5,10,15),而是枚举每种食品包的购买数量,使其总价 ≤ 预算,并将包数换算为实际单品数(例如:1包香肠 = 6根,故 n 包 → n × 6 根)。原始代码误将价格数组当作排列对象,导致输出无意义的数字序列;正确思路是使用嵌套循环或状态递增法遍历合法的 (worst_pack, burger_pack, frikandel_pack) 三元组。

以下是一个清晰、可控、可扩展的实现方案:

<?php // 定义商品单价(每包)与单包包含量
$prices = [
    'worst'      => 5,   // 每包 6 根,¥5
    'hamburger'  => 10,  // 每包 20 个,¥10
    'frikandel'  => 15   // 每包 25 根,¥15
];

$units = [
    'worst'      => 6,
    'hamburger'  => 20,
    'frikandel'  => 25
];

// 从标准输入读取预算(兼容 CLI 环境)
if (PHP_SAPI === 'cli') {
    fwrite(STDOUT, "请输入预算(欧元): ");
    $budget = (int)trim(fgets(STDIN));
    if ($budget  $w * $units['worst'],
                    'hamburger' => $h * $units['hamburger'],
                    'frikandel' => $f * $units['frikandel'],
                    'cost'      => $total
                ];
            }
        }
    }
}

// 输出格式化结果(按成本升序,增强可读性)
usort($combinations, fn($a, $b) => $a['cost']  $b['cost']);
foreach ($combinations as $i => $combo) {
    echo sprintf(
        "• %d worsten, %d hamburgers, %d frikandellen (花费 ¥%d)\n",
        $combo['worst'],
        $combo['hamburger'],
        $combo['frikandel'],
        $combo['cost']
    );
}

echo "\n共找到 " . count($combinations) . " 种可行组合。\n";
?>

关键设计说明:

PHP
PHP

编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。

下载
  • 避免排列陷阱:不 shuffle 或 permute 价格,而是枚举各商品包的购买数量(整数非负),确保解空间物理可实现;
  • 单位自动换算:用 $units 数组解耦「包」与「单品」,输出直接展示终端用户关心的 worsten/hamburgers 数量;
  • 预算严格约束:内层循环上限由剩余预算动态计算($max_f),杜绝无效迭代;
  • CLI 友好:使用 fgets(STDIN) 读取交互式输入,适配命令行场景;
  • 可扩展性强:新增品类只需向 $prices 和 $units 添加键值对,循环结构无需修改。

⚠️ 注意事项:

  • 当预算较大(如 >€500)且品类增多时,三层循环可能性能下降;此时建议改用回溯剪枝动态规划生成最优子集
  • 实际部署中应加入输入校验(如非数字、负数、超长输入);
  • 若需限制最小/最大单品数(如“至少100个汉堡”),可在循环体内添加 continue 条件过滤。

该方案直击问题本质——在整数线性约束下枚举可行解,输出直观、逻辑透明、易于维护,是典型背包类问题的轻量级实践范例。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

8884

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5421

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

1995

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3348

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4014

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3151

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4457

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3482

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11542

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习