`

根据总用量计算每种包装规格的购买量和总价 后续篇(一)并且使得用户花费最少

 
阅读更多

  在根据总用量计算每种包装规格的购买量和总价 中讲述了一个开发的场景,首先有一个总共的土地拥有量:total亩,现在有n种可以选择的商品,每一种商品都有每亩的用量:amount/亩,每一种商品都有多个包装规格,每个包装规格有自己的包装量和售价。

  需求就是计算出,在给定土地上面种植那种商品需要的花费最少,也就是可以用最少的钱来买更多的东西种地,满足我种地的最大需求量。

  其实我们还假设了一个前提,就是包装大的单价低,好比100克每包的可能买100元,200克每包的就应该卖180元,肯定会小于两个100克每包的价格,这个也是市场调研的结果,也比较符合市场常规。

  代码中用到了二分搜索法的思路,其实我需要的是一个定位,定位我需要购买的最合算的包装规格,也就是在满足需要的情况下,尽可能购买大包装。

  例如:现在有两个商品,土豆和白菜,土豆有三个规格,100克每包的100元,200克每包的180元,300克每包的240元;白菜有四个规格,100克每包的70元,200克每包的130元,300克每包的200元,400克每包的300元。种白菜每亩要100斤,中土豆每亩尧200斤。我总共有1029亩地,计算一下,是种土豆花费少?还是种白菜花费少?

  有两个点要注意:1)找位置,找到我需要购买的最合算的包装规格的位置,使用了二分搜索2)计算用量和预算。

  计算一种商品最少花费的伪代码如下:

  输入:一个商品的信息,包括包装规格

  输出:需要购买的包装规格几个数,总共的花费

  计算过程:

  {

    while(总量>最小包装规格的量)

    {

      1)找位置,定位包装规格

      2)计算需要购买多少个第一步找到的包装规格

      3)需要购买的个数=总量和包装规格的包装量取整

      4)总量=总量-需要购买的个数*包装规格的包装量

      5)这种商品的预算+=需要购买的个数*包装规格的单价

    }

    if(总量<=最小包装规格的量)

    {

      说明零头就只能买个最小包装了,因为购买不支持散买。

    }

  }

 

  示例代码下载:/Files/virusswb/BeautyCode.ConApp.rar

  代码如下:

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->/*
 * Created by SharpDevelop.
 * User: haier
 * Date: 2010-3-23
 * Time: 22:19
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
using System;
using System.Collections.Generic;

namespace BeautyCode.ConApp
{
    
/// <summary>
    
/// 种植方案
    
/// </summary>
    public class PlantArea
    {
        
/// <summary>
        
/// 种植面积,单位是亩
        
/// </summary>
        public static decimal PlantAreaAmount=175.25m;
    }
    
/// <summary>
    
/// 商品类型
    
/// </summary>
    public enum ProductType
    {
        
/// <summary>
        
/// 种子
        
/// </summary>
        Seed,
        
/// <summary>
        
/// 肥料
        
/// </summary>
        Fertilizer,
        
/// <summary>
        
/// 农药
        
/// </summary>
        Pesticide
    }
    
    
public enum FertType
    {
        
/// <summary>
        
/// 底肥
        
/// </summary>
        DiF,
        
/// <summary>
        
/// 种肥
        
/// </summary>
        ZhongF,
        
/// <summary>
        
/// 追肥
        
/// </summary>
        ZhuiF
    }
    
public class Unit
    {
        
public Guid ID{set;get;}
        
        
public string CnName{set;get;}
    }
    
public class PkgPrice
    {
        
public Guid PkgID{set;get;}
        
/// <summary>
        
/// 包装量
        
/// </summary>
        public decimal PkgAmount{set;get;}
        
/// <summary>
        
/// 包装单位
        
/// </summary>
        public Unit PkgUnit{set;get;}
        
/// <summary>
        
/// 包装价格
        
/// </summary>
        public decimal Price{set;get;}
        
/// <summary>
        
/// 选中的包装个数
        
/// </summary>
        public int Quantities{set;get;}
    }
    
    
public class Product
    {
        
public virtual Guid ID{set;get;}
        
public virtual string Name{set;get;}
        
public virtual ProductType ProType{set;get;}
        
/// <summary>
        
/// 每亩用量
        
/// </summary>
        public virtual decimal Amount{set;get;}
        
/// <summary>
        
/// 每亩用量单位
        
/// </summary>
        public virtual Unit ProductUnit{set;get;}
        
/// <summary>
        
/// 总用量
        
/// </summary>
        public virtual decimal TotalAmount{set;get;}
        
public Product (ProductType type)
        {
            
this.ProType=type;
        }
        
/// <summary>
        
/// 预算
        
/// </summary>
        public decimal Budget{set;get;}
        
/// <summary>
        
/// 全部包装类型
        
/// </summary>
        public List<PkgPrice > AllPkgPrice{set;get;}
        
/// <summary>
        
/// 选中的包装类型
        
/// </summary>
        public List<PkgPrice > SelectPkgPrice{set;get;}
    }
    
public class Seed:Product 
    {
        
public Seed ():base(ProductType.Seed ){}
        
        
public List<Pesticide > Pesticides{set;get;}
        
public List<DiF > DiFs{set;get;}
        
public List<ZhongF >ZhongFs{set;get;}
        
public List<ZhuiF >ZhuiFs{set;get;}
    }
    
public class Fertilizer:Product 
    {
public FertType FType{set;get;}
        
public Fertilizer (FertType type):base (ProductType.Fertilizer){
        
this.FType=type ;
        }
    }
    
public class DiF:Fertilizer 
    {
        
public DiF ():base (FertType.DiF ){}
    }
    
public class ZhongF:Fertilizer 
    {
        
public ZhongF ():base (FertType .ZhongF ){}
    }
    
public class ZhuiF:Fertilizer 
    {
        
public ZhuiF ():base (FertType.ZhuiF ){}
    }
    
public class Pesticide:Product 
    {
        
public Pesticide ():base(ProductType.Pesticide ){}
    }
    
/// <summary>
    
/// Description of BeiBao.
    
/// </summary>
    public class BeiBao
    {
        
public List<Seed  >Seeds=null;
        
public Seed  Seed=null;
        
public List<Pesticide >Pesticides=null;
        
public Pesticide Pesticide=null;
        
public List<DiF >DiFs=null;
        
public DiF DiF=null;
        
public List<ZhongF >ZhongFs=null;
        
public ZhongF ZhongF=null;
        
public List<ZhuiF >ZhuiFs=null;
        
public ZhuiF ZhuiF=null;
        
public List<PkgPrice > PkgPrices=null;
        
public BeiBao()
        {
            Seeds 
=new List<Seed  >();
            Seed 
=new Seed(){ ID=Guid.NewGuid (),
                Name
="土豆", Amount =120, Budget=0,
                TotalAmount 
=120*PlantArea.PlantAreaAmount };
            PkgPrices 
=new List<PkgPrice>(){
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =100, Price=23},
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =210, Price=58},
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =130, Price=39}};
            Seed .AllPkgPrice 
=PkgPrices ;
            Seed.AllPkgPrice.Sort(
new Comparison<PkgPrice >(comparePkgAmountAsc));
            Seeds.Add(Seed );
            Seed 
=new Seed(){ ID=Guid.NewGuid (),
                Name
="白菜", Amount =150, Budget=0, TotalAmount =150*PlantArea.PlantAreaAmount };
            PkgPrices 
=new List<PkgPrice>(){
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =80, Price=20},
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =180, Price=48},
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =110, Price=34}};
            Seed .AllPkgPrice 
=PkgPrices ;
                Seed.AllPkgPrice.Sort(
new Comparison<PkgPrice >(comparePkgAmountAsc));
            Seeds.Add(Seed );
            Seed 
=new Seed(){ ID=Guid.NewGuid (),
                Name
="萝卜", Amount =100, Budget=0, TotalAmount =100*PlantArea.PlantAreaAmount };
            PkgPrices 
=new List<PkgPrice>(){
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =110, Price=35},
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =250, Price=79},
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =170, Price=49}};
            Seed .AllPkgPrice 
=PkgPrices ;
                Seed.AllPkgPrice.Sort(
new Comparison<PkgPrice >(comparePkgAmountAsc));
            Seeds.Add(Seed );
            Seed 
=new Seed(){ ID=Guid.NewGuid (),
                Name
="大豆", Amount =20, Budget=0, TotalAmount =20*PlantArea.PlantAreaAmount };
            PkgPrices 
=new List<PkgPrice>(){
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =110, Price=35},
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =250, Price=79},
                
new PkgPrice (){ PkgID=Guid.NewGuid (),PkgAmount =170, Price=49}};
            Seed .AllPkgPrice 
=PkgPrices ;
                Seed.AllPkgPrice.Sort(
new Comparison<PkgPrice >(comparePkgAmountAsc));
            Seeds.Add(Seed );
        }
        
        
public Product ComputeOptimized()
        {
            
            
foreach (Product p in this.Seeds  )
            {
                GetTotalBudget ( p);
            }
            Seeds.Sort (
new Comparison<Seed  >(compareProductBudgetAsc ));
            
return Seeds[0];
        }
        
private void  GetTotalBudget(Product p)
        {
            p.SelectPkgPrice
=new List<PkgPrice>();
            
int index=-1;
            
int quantities=0;
            
decimal totalamount=p.TotalAmount;
            
while (totalamount >p.AllPkgPrice [0].PkgAmount )
            {
                index 
=binaryLocalize (p.AllPkgPrice,totalamount,p.AllPkgPrice.Count );
                
if(index !=-1)
                {
                    quantities 
=(int)(totalamount /p.AllPkgPrice [index ].PkgAmount );
                    
//quantities =(int)(totalamount %p.AllPkgPrice [index ].PkgAmount );
                    p.SelectPkgPrice.Add(new PkgPrice (){
                                             PkgID
=p.AllPkgPrice[index].PkgID ,
                                             PkgAmount
=p.AllPkgPrice[index].PkgAmount,
                                             Price
=p.AllPkgPrice[index].Price ,
                                             Quantities
=quantities 
                                         });
                    p.Budget 
+=quantities *p.AllPkgPrice[index].Price ;
                }
                totalamount 
-=quantities *p.AllPkgPrice[index].PkgAmount;
            }
            
if(totalamount !=0)
            {
                quantities 
=1;
                index 
=0;
                p.SelectPkgPrice.Add(
new PkgPrice (){
                                             PkgID
=p.AllPkgPrice[index].PkgID ,
                                             PkgAmount
=p.AllPkgPrice[index].PkgAmount,
                                             Price
=p.AllPkgPrice[index].Price ,
                                             Quantities
=quantities 
                                         });
                    p.Budget 
+=quantities *p.AllPkgPrice[index].Price ;
            }
            
        }
        
/// <summary>
        
/// 二分法搜索元素
        
/// </summary>
        
/// <param name="a"></param>
        
/// <param name="x"></param>
        
/// <param name="n"></param>
        
/// <returns></returns>
        private int binarySearch(List<int >a,int x,int n)
        {
            
int left=0;
            
int right=n-1;
            
while (left <=right)
            {
                
int middle=(left +right )/2;
                
if(x==a[middle])return middle;
                
if(x>a[middle ])left =middle +1;
                
else right =middle -1;
            }
            
//没有找到
            return -1;
        }
        
/// <summary>
        
/// 二分法定位规格
        
/// </summary>
        
/// <param name="pkgPrices"></param>
        
/// <param name="totalAmount"></param>
        
/// <param name="n"></param>
        
/// <returns></returns>
        private int binaryLocalize(List<PkgPrice > pkgPrices,decimal  totalAmount,int n)
        {
            
if(totalAmount >=pkgPrices [n-1].PkgAmount )
                
return n-1;
            
            
int left=0;
            
int right=n-1;
            
while (left <=right )
            {
                
int middle=(left+right )/2;
                
if(totalAmount >=pkgPrices [middle ].PkgAmount &&totalAmount <pkgPrices [middle +1].PkgAmount )
                {
                    
return middle ;
                }
                 
if(totalAmount ==pkgPrices [middle +1].PkgAmount )
                {
                    
return middle +1;
                }
                 
if(totalAmount >pkgPrices [middle +1].PkgAmount )
                     left 
=middle +1;
                 
else
                     right 
=middle -1;
            }
            
return -1;
        }
        
private int compareProductBudgetAsc(Product pro1,Product pro2)
        {
            
if(pro1.Budget>pro2 .Budget )
                
return 1;
            
if(pro1.Budget<pro2 .Budget )
                
return -1;
            
else 
                
return 0;
        }
        
        
private int comparePkgAmountAsc(PkgPrice pkg1,PkgPrice pkg2)
        {
            
if(pkg1.PkgAmount >pkg2.PkgAmount )
                
return 1;
            
if(pkg1.PkgAmount <pkg2 .PkgAmount )
                
return -1
分享到:
评论

相关推荐

    工程量计算稿

    《工程量计算稿》是一款专为建筑工程领域设计的软件,其1.55版本进一步提升了用户体验,通过简化操作流程和引入自动汇总功能,使得工程量的计算与管理变得更加高效便捷。这款工具对于工程师、造价员以及相关从业者来...

    工程量计算稿1.55

    工程量计算稿1.55是一款专用于建筑工程领域进行工程量计算的专业软件。这款软件集成了最新的工程计算规则和标准,旨在帮助工程师、造价师以及建筑行业的从业者高效准确地完成工程项目的成本估算和预算编制。它包含了...

    疏浚吹填工程量计算程序

    疏浚吹填工程是海洋与港口建设中的关键环节,...总的来说,“疏浚吹填工程量计算程序”是工程技术人员的重要辅助工具,它的应用使得疏浚吹填工程的计算工作更加科学化、规范化,提高了整个项目的管理效率和经济效益。

    动态规划算法最少费用问题的C++代码

    4. **输出结果**:最后输出 `g[n][a]`,即购买 `n` 个第一类商品和 `a` 个第二类商品时的最少花费。 #### 代码逻辑分析 该算法的主要逻辑可以概括为以下步骤: 1. **初始化**:设置变量并初始化二维数组 `g`。 2. ...

    SQL语句在审计

    SELECT语句的作用是让数据库服务器根据用户的要求搜索出所需要的信息资料,并按规定的格式进行整理,再返回给用户。 一、SELECT语句的基本组件和描述: * SELECT:指明要检索的数据的列。 * FROM:指明从哪(几)...

    最少费用购物问题 算法设计

    本篇文章将深入探讨如何运用C++编程语言来设计和实现一个高效的算法,以解决最少费用购物问题。 #### 问题背景与定义 最少费用购物问题通常涉及多个商品种类,每个商品有其特定的价格、可购买数量以及可能存在的...

    人教二年级数学下册混合运算看图列式计算和应用题PPT课件.pptx

    - 总价 ÷ 数量 = 单价:如果已知总花费和购买的物品数量,可以计算出单个物品的价格。 - 总价 ÷ 单价 = 数量:当知道总花费和单价时,可以计算出购买的物品数量。 2. **看图列式计算**: - 学生需要观察图片中...

    jQuery购物车自动计算金额表单多数据加减商城购物结算

    在开发电商网站时,购物车功能是至关重要的一个部分,它需要实时地更新商品数量、单价和总价,以便用户能够清楚地了解他们的购物选择。在这个主题中,"jQuery购物车自动计算金额表单多数据加减商城购物结算"涉及到的...

    jQuery购物车自动计算金额表单

    【jQuery购物车自动计算金额表单】是一个基于jQuery技术实现的简单购物车功能,它能够自动计算用户在购物车中选择商品的总价。这个功能在电商网站中非常常见,为用户提供了一个直观的方式来查看他们所选商品的总价值...

    顾客购买量调查表.doc

    10. 营销策略:根据调查结果,企业可以调整广告宣传、促销活动和优惠策略,以刺激购买量,提升人均花费,从而提高整体业绩。 总的来说,"顾客购买量调查表"提供了关于消费者购买行为的关键信息,对于优化企业运营,...

    最少费用问题.doc

    动态规划的思想是,通过构建一个二维数组来存储每种商品的购买成本和优惠策略信息,然后使用贪心算法来找到最小化总成本的购买方案。 给定的代码是一个完整的解决最少费用问题的算法设计方案,该方案可以广泛应用于...

    商品规格和价格设置,适用于电商平台PC后台

    用户在选择商品时,可以根据这些规格进行筛选和购买。在后台系统中,管理员需要能够方便地添加、编辑和管理这些规格,包括设置不同的规格项和对应的值。 JavaScript和jQuery在这其中起到了关键作用。JavaScript是一...

    四年级数学上册单价数量总价专项复习PPT学习教案.pptx

    5. 根据平均每天的销售量,计算一个月的总销售量。 通过这些练习题,学生不仅能掌握单价、数量和总价的概念,还能提升解决实际问题的能力,训练逻辑思维和运算技巧。这些基础知识对于日常生活和进一步的数学学习至...

    单价数量总价说课稿.doc

    反之,如果小明知道他总共花费了20元购买铅笔,而每支铅笔的单价为2元,可以通过除法计算出购买的铅笔数量: - **总价**:20元 - **单价**:2元/支 - **数量**:20元 ÷ 2元/支 = 10支 以上就是关于单价、数量和...

    仿美团外卖点击加号增加购买的数量点击减号减少购买数量并显示当前购买的总价.rar

    这个功能通常涉及到用户交互、数量控制以及总价计算,是电商应用程序中的核心组件之一。 在实际的美团外卖应用中,用户可以通过点击“+”号增加商品的数量,或者通过点击“-”号减少已选择的商品数量。这个过程应该...

    顾客购买量调查表(表格模板、DOC格式).doc

    顾客购买量调查表是一种有效的方法,用于收集和分析消费者的购物习惯,以便优化产品策略、提升销售额和提高客户满意度。这份"顾客购买量调查表(表格模板、DOC格式)"文档提供了一个标准化的框架,企业可以依据此...

    快速订购与显示购买量与浏览数

    总的来说,这个"快速订购与显示购买量与浏览数"的ShopEx插件,对于提升电商平台的用户体验和商家的数据洞察力具有显著价值。通过安装和配置这个插件,商家不仅可以提升订单处理效率,还能获得关于商品热度的关键数据...

    购物车 全选计算价格 删除 变状态

    在电子商务网站中,购物车是用户进行商品选购的核心功能之一,它承载了用户选择的商品、数量、价格等信息。本文将深入探讨“购物车全选计算价格、删除及变状态”这一主题,以帮助理解购物车系统的关键实现原理。 1....

    一个数据表有单价有数量,还有checkbox选择,然后计算总价

    标题和描述中提到的核心是创建一个带有单价、数量和复选框的数据表,其中用户可以选择特定项并实时计算总价。这种功能对于购物车或者产品列表非常常见,它需要前端JavaScript技术来实现动态交互。 首先,我们来看...

Global site tag (gtag.js) - Google Analytics