【PHP】算法: 获取满足给定值的最优组合
PHP 获取给定值的最优组合
方法 - (蓝洛提供,博客地址: www.zhaorui.info)
<?php
ini_set('error_reporting','E_ALL^E_NOTICE');
$arr2 = array(
0 => array(
'id'=>'1',
'cur' => '15',
'cash' => '2'
),
1 => array(
'id'=>'2',
'cur' => '20',
'cash' => '2'
),
2 => array(
'id'=> '3',
'cur' => '10',
'cash' => '2'
),
3 => array(
'id'=> '4',
'cur' => '6.2',
'cash' => '10'
),
);
$arr = array_column($arr2,'cur');
//循环取出,转化成整数类型
foreach($arr as &$v){
$v = intval($v);
}
print_r($arr);
unset($v);
$maxSize = floor(23.6);//此处填写要的值
//$arr = array(15, 20, 10, 6,30,5,1,13,17,9);
$result = array();
$answers = array();
$currSize = floor(23.6);//此处也填写要的值
$len = count($arr);
for ($i = 0; $i < $len; $i++) {
$result[] = array();
for ($j = 0; $j <= $maxSize; $j++) {
$result[$i][$j] = 0;
}
}
//var_dump($result);die;
for ($i = 0; $i <= $maxSize; $i++) {
for ($j = 0; $j < $len; $j++) {
if ($arr[$j] > $i) {
if ($j === 0) $result[$j][$i] = 0;
else $result[$j][$i] = $result[$j - 1][$i];
} else {
if ($j === 0) $result[$j][$i] = $arr[$j];
else $result[$j][$i] = max($result[$j - 1][$i], $result[$j - 1][$i - $arr[$j]] + $arr[$j]);
}
}
}
// 找出答案
for ($i = $len - 1; $i >= 0 && $currSize !== 0; $i--) {
if ($result[$i][$currSize] - $result[$i - 1][$currSize - $arr[$i]] === $arr[$i]) {
$answers[] = $arr[$i];
$currSize -= $arr[$i];
} }
print_r($answers); $arr3 = array();
foreach($arr2 as $k=>$v){
if(in_array(intval($v['cur']),$answers)){
$arr3[$k]=$v;
}
} print_r($arr3);
方法二:
<?php
$result_flb = array(
array('id'=>'1','currency' => '15','cash' => '2',),
array('id'=>'2','currency' => '20','cash' => '2'),
array('id'=> '3','currency' => '10','cash' => '2'),
array('id'=> '4','currency' => '6','cash' => '10'),
);
$arr = array_column($result_flb,'currency');
//循环取出,转化成floor类型
foreach($arr as &$v){
$v = floor($v);
}
unset($v);
$max = 23; //想要的值
$re = digui($arr);
foreach ($re as $key => $value) {
if ($key <= $max) {
isset($result) || $result = [$key, $value];
if ($key > $result[0]) {
$result = [$key, $value];
}
}
}
isset($result) || $result = [0, []];
print_r($result); //打印答案
function digui($arr, $re = []) {
if (count($arr) == 0) {
return [];
}
if (count($arr) == 1) {
$re[$arr[0]] = [$arr[0]];
}
if (count($arr) >= 2) {
$x = array_shift($arr);
$re[$x] = [$x];
for ($b = 0; $b < count($arr); $b++) {
$result = $x + $arr[$b];
$re[$result] = [$x, $arr[$b]];
}
$re = digui($arr, $re);
foreach ($re as $k => $v) {
if (!in_array($arr[0], $v)) {
array_unshift($v, $arr[0]);
$re[$arr[0] + $k] = $v;
}
}
}
return $re;
}
?>
【PHP】算法: 获取满足给定值的最优组合的更多相关文章
- 【PHP】算法进阶,获取给定值的最优组合:虚拟币抵扣问题解决方案
商城里边.虚拟币抵扣问题解决方案 虚拟币抵扣规则,按照以下规则执行: 1.如果一个订单包含多款商品,且均支持虚拟币抵扣时: 优先按照最大化使用虚拟币进行全额抵扣原则进行抵扣,若抵扣后用户虚拟币账号 ...
- silverlight中 ComboBox绑定数据库,并获取当前选定值
silverlight中 ComboBox绑定数据库,并获取当前选定值 在silverlight中 用combobox下拉菜单绑定数据库的方法和用DataGrid绑定数据库的方法类似. page.xa ...
- LD算法获取字符串相似度
一个如何识别相似语句的问题,于是上网找了找,一个叫Levenshtein Distance的算法比较简单,就写了段代码实现了一下,效果还不错. 这个算法是一个俄国人Lvenshtein提出的,用于计算 ...
- 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...
- 替归算法获取Treeview所有节点
treeview.nodes是获取下一级所有子节点,但是如果是多层的话,就不能,想个法子来获取所有的节点(含节点的子节点),想了想 还是替归算法比较方便,如是有了下面的代码 public static ...
- javascript A*算法 寻路算法 获取最短路径算法
//A算法 自动寻路 路径 class GetAutoPath{ constructor(id, map, sPos, ePos, mapArr){ //this.type = id.type; th ...
- 分布式雪花算法获取id
实现全局唯一ID 一.采用主键自增 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: 1)不同数据 ...
- easyui treegrid实现显示checkbox并能获取到选定值的
闲聊: 小颖最近忙疯了,经常被加班,昨天都要下班了,又提了个需求,虽然写的代码不多只有几行,可是测试环境很难跑通,一会就ie崩溃了,所以弄得小颖最近老是头晕. 也不知道最近是怎么了,一向特别爱吃的小颖 ...
- Marching squares 算法 获取轮廓(contour tracing)
https://en.wikipedia.org/wiki/Marching_squares http://blog.csdn.net/coolingcoding/article/details/1 ...
随机推荐
- 设计模式-观察者模式(上)<转>
本文参考Head First设计模式一书,感觉书中的例子实在很好,很贴切.对模式的知识点进行总结,并对书的源码做了一定注释. 观察者模式要点有二:主题和观察者. 最贴切的案例是:杂志订阅,杂志是主 ...
- Apache HttpComponents Custom protocol interceptors通过拦截器自定义压缩
/* * ==================================================================== * Licensed to the Apache S ...
- jffs2根文件系统制作
http://www.eetop.cn/blog/html/98/510998-20964.html 作者:刘洪涛,华清远见嵌入式学院高级讲师,ARM公司授权ATC讲师. JFFS2是Flash上应用 ...
- Ubuntu12.10 使用JLink连接开发板用arm-gdb调试ARM程序
Part1 环境搭建和工具安装 1.1 设置交叉编译环境 安装相关的编译工具: sudo apt-get install build-essential gcc-arm-linux-gnueabi 这 ...
- shell脚本----if(数字条件,字符串条件,字符串为空)
二元比较操作符,比较变量或者比较数字. 注意数字与字符串的区别. 1.整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如 ...
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
- hive thrift 开机启动
这个问题困扰我很久,之前redis的时候,也出现了这个问题,从网上找的thrift脚本没有一个好使的,最后通过修改/etc/rc.d/rc.local来执行一些非服务的命令,这样子就不需要像写服务那样 ...
- Android自己定义控件--圆形进度条(中间有图diao)
智能家居越来越流行,在智能家居中我们常要表现一些数据的百分比 圆形度条中间加个图是一种很流行的自己定义View 1.第一步 你首先须要对类进行继承View public class CirclePro ...
- *.ashx一般处理程序不能访问Session值的解决方法
<%@ WebHandler Language="C#" Class="productHandler" %> using System; using ...
- thinkphp 前台测试
配置文件 <?php return array( 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'localhost', // 服务器地址 ...