商城里边。虚拟币抵扣问题解决方案
虚拟币抵扣规则,按照以下规则执行:
1.如果一个订单包含多款商品,且均支持虚拟币抵扣时:
  优先按照最大化使用虚拟币进行全额抵扣原则进行抵扣,若抵扣后用户虚拟币账号仍有余额可以使用,且仍有未抵扣的商品,则继续抵扣剩余未抵扣商品中最小抵扣额度的商品;
  示例:
  1)用户虚拟币账户余额650,下单购买5款商品(A、B、C、D、E),5款商品分别可抵扣最大金额为(A->100,B->200,C->300,D->400,E->500)此时抵扣结果为:
  优先全额抵扣A、E 两款商品,
  再抵扣B款商品50个虚拟币,50个虚拟币可抵扣的商品金额,根据后端设置进行比例计算,小数点保留2位 (舍去法,不进行四舍五入)
  
  2)用户虚拟币账户余额60,下单购买5款商品(A、B、C、D、E),5款商品分别可抵扣最大金额为(A->100,B->200,C->300,D->400,E->500)此时抵扣结果为:
  优先全额抵扣商品不存在,
  则直接抵扣A款商品60个虚拟币,60个虚拟币可抵扣的商品金额,根据后端设置进行比例计算,小数点保留2位(舍去法,不进行四舍五入)
  
  3)用户虚拟币账户余额2000,下单购买5款商品(A、B、C、D、E),5款商品分别可抵扣最大金额为(A->100,B->200,C->300,D->400,E->500)此时抵扣结果为:
  优先全额抵扣A、B、C、D、E 所有商品,
 
  4)用户虚拟币账户余额0,下单购买5款商品(A、B、C、D、E),5款商品分别可抵扣最大金额为(A->100,B->200,C->300,D->400,E->500)此时抵扣结果为:
  不用抵扣
 
<?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 = 4;
$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, []]; $arr_yes = array(); //满足条件的集合
$arr_no = array(); //不满足条件的集合
foreach($result_flb as $k=>$v){
if(in_array(floor($v['currency']),$result['1'])){
$arr_yes[$k]=$v;
$arr_yes[$k]['bili']=100;
}else{
$arr_no[$k]=$v; } } $arr_no = array_sort($arr_no);
$fine_money = $result[0];
if(empty($arr_no)){
$finally = $fine_money;
}else{
$bilie = $arr_no['currency'] / $arr_no['cash'];
$bilie_money =intval(($max-$fine_money)/$bilie * pow(10, 2))/ pow(10, 2) ;// 舍去小数点取整: 不使用四舍五入
$finally = $fine_money + $bilie_money;
$arr_no['bili'] = $bilie*100;
} $he_no[0] = $arr_no; $res = array_merge_recursive($arr_yes,$he_no); echo $finally; //最终结果 function array_sort($arr_no){
// 装入临时数组
$cur = array();
foreach ($arr_no as $key => $value) {
$cur[$value['id']] = $value['currency'];
}
// 临时数组排序
sort($cur);
// 原数组排序、取值
$result = array();
foreach ($arr_no as $key => $value) {
switch ($value['currency']) {
case $cur[0]:
$result = $value;
break;
}
}
return $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】算法进阶,获取给定值的最优组合:虚拟币抵扣问题解决方案的更多相关文章

  1. 【PHP】算法: 获取满足给定值的最优组合

    PHP 获取给定值的最优组合 方法 -   (蓝洛提供,博客地址: www.zhaorui.info) <?php ini_set('error_reporting','E_ALL^E_NOTI ...

  2. C#算法实现获取树的高度

    我们知道,树类型作为数据结构中的重要一员,树的很多实现都是来自递归.本文想要实现的就是在桌面客户端项目开发中,经常用到的树结构(.Net平台下有个控件为TreeView).事实上,我们可能因业务需求自 ...

  3. 国产芯片任重道远 国科微SSD主控芯片的“追赶之路”(不能只提供一颗芯片,而是要将芯片、国密算法、固件Firmware、BIOS和操作系统紧密联系在一起,变成完整解决方案交给行业用户,才能真正体现自身的价值)

    集微网消息,“中国芯”战略之路道阻且长,踏入这个赛道的攻坚者们需要十年如一日的技术突破,需要集合产业势能,共同协作,方能建立中国核心技术真正的竞争力. 国产化之路任重道远,SSD芯片初见成效 信息时代 ...

  4. 算法进阶之Leetcode刷题记录

    目录 引言 题目 1.两数之和 题目 解题笔记 7.反转整数 题目 解题笔记 9.回文数 题目 解题笔记 13.罗马数字转整数 题目 解题笔记 14.最长公共前缀 题目 解题笔记 20.有效的括号 题 ...

  5. 获取所有组合算法、获取全排列算法(java)

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5574516.html 受到ACM1015的影响,个人感觉,有必要对统计学上的 全组合和全排列 进行一个简单的总结 ...

  6. java 雪花算法实现获取分布式id

    import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...

  7. [算法进阶0x10]基本数据结构C作业总结

    t1-Supermarket 超市利润 题目大意 给定n个商品,每个商品有利润pi和过期时间di.每天只能卖一个商品,过期商品不能卖.求如何安排每天卖的商品可以使收益最大. 分析 一开始打了一个复杂度 ...

  8. CNN:人工智能之神经网络算法进阶优化,六种不同优化算法实现手写数字识别逐步提高,应用案例自动驾驶之捕捉并识别周围车牌号—Jason niu

    import mnist_loader from network3 import Network from network3 import ConvPoolLayer, FullyConnectedL ...

  9. NN:神经网络算法进阶优化法,进一步提高手写数字识别的准确率—Jason niu

    上一篇文章,比较了三种算法实现对手写数字识别,其中,SVM和神经网络算法表现非常好准确率都在90%以上,本文章进一步探讨对神经网络算法优化,进一步提高准确率,通过测试发现,准确率提高了很多. 首先,改 ...

随机推荐

  1. Wireshark 分析捕获的数据记录

    使用 Wireshark 选取你要抓包的网络接口,并设置你的过滤器之后,当有数据通信后即可抓到对应的数据包,这里将分析其每一帧数据包的结构. 每一帧数据都有类似的结构组成,我这里使用抓到一个对应的pi ...

  2. linux 共享内存shm_open实现进程间大数据交互

    linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #includ ...

  3. EMC现场测试-EFT、ESD、Surge和场辐射

    EMC测试主要进行了4项: 1. ESD 采用静电枪测试,接触电压±6KV,检测了整个箱体和内部可见金属部分: 空气放电正负8KV,检测了箱体及内部金属部分(如板卡壳体),特别检测了220V电源插头及 ...

  4. BusyBox getty

    linux的登录主要是由两个文件在控制,/usr/sbin/getty来获得用户名,并进行检查用户名是否存在,然后将用户名传递给/usr/bin/login来获取用户输入密码和检查密码是否正确. 所以 ...

  5. wireshark error: There are no interfaces on which a capture can be done.

    一.Linux环境:1.root用户启动 01.启动一个shell 02.sudo wireshark (需要root权限) 2.普通用户启动 从Linux中第一次启动Wireshark的时候,可能会 ...

  6. yum-plugin-priroites这个插件的一个文件。

    yum源优先级的一个文件.是yum-plugin-priroites这个插件的一个文件.用来给yum源分优先级的.比如你在centos下有centos,epel,rpmfusion三个yum源.三个y ...

  7. anroid 广播

    广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroa ...

  8. 第二百九十二节,RabbitMQ多设备消息队列-Python开发

    RabbitMQ多设备消息队列-Python开发 首先安装Python开发连接RabbitMQ的API,pika模块 pika模块为第三方模块  对于RabbitMQ来说,生产和消费不再针对内存里的一 ...

  9. 使用Grunt构建任务管理脚本(转)

    Grunt是构建Web开发的一个系统,但它创建比较困难.在这个指南中,你将学会如何配置Grunt创建一个现代的Web项目.当你完成教程中的配置之后,你的Gruntfile将具有: 从源目录中向目标目录 ...

  10. CentOS显示设置时间命令- date

    概要: date命令的功能是显示和设置系统日期和时间 命令格式: date [OPTION]... [+FORMAT]date [-u|--utc|--universal] [MMDDhhmm[[CC ...