根据总用量计算每种包装规格的购买量和总价

  

  最近有这么一个需求,就是给出客户需要的总量,然后根据数据库记录的包装规格,计算出客户需要购买的包装规格种类和个数,而且要保证客户的花费最小。

  示例图片效果

  示例代码实现如下。欢迎大家一起讨论。

  

ExpandedBlockStart.gif 代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> using System;
using System.Collections.Generic;
using System.Linq;
using System.
Text ;
using System.Web.Security;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string
[]  args)
        {

            
decimal  area  =   110 ;
            Console.WriteLine("你的土地面积是:{
0 }", area);
            
decimal  amount  =  10m;
            Console.WriteLine("你的每亩用量是是:{
0 }", amount);
            
decimal  budget  =   0 ;

            
decimal  budgetMin  =   0 ;

            List
< product >  products  =  new List < product > ();
            product product1 
=  new product()
            {
                Id 
=   1 ,
                Name 
=  "土豆",
                PkgSpecs 
=  new List < pkgspec > (){
                  new pkgspec() { amount 
=   202 , price  =   120 , id  =   2  },
                  new pkgspec() { amount 
=   300 , price  =   40 , id  =   1  },
                  new pkgspec() { amount 
=   250 , price  =   80 , id  =   3  }}
            };
            product1.PkgSpecs.Sort(new Comparison
< pkgspec > (compareAmountDesc));
            products.
Add (product1);

            product product2
=  new product (){ Id = 1 , Name = "白菜", PkgSpecs  = new List < pkgspec > (){
                  new pkgspec() { amount 
=   200 , price  =   180 , id  =   2  },
                  new pkgspec() { amount 
=   100 , price  =   100 , id  =   1  },
                  new pkgspec() { amount 
=   250 , price  =   250 , id  =   3  }}};
            product2.PkgSpecs.Sort(new Comparison
< pkgspec > (compareAmountDesc));
            products.
Add (product2);

            product  product3
=  new product (){ Id = 1 , Name = "萝卜", PkgSpecs  = new List < pkgspec > (){
                  new pkgspec() { amount 
=   200 , price  =   210 , id  =   2  },
                  new pkgspec() { amount 
=   100 , price  =   150 , id  =   1  },
                  new pkgspec() { amount 
=   250 , price  =   220 , id  =   3  }}};
            product3.PkgSpecs.Sort(new Comparison
< pkgspec > (compareAmountDesc));
            products.
Add (product3);

            
// 全部商品需要的购买规格和预算
            List
< productSelect >  proselects  =  new List < productSelect > ();
            
// 最终选中的商品
            productSelect proselect 
=   null ;
            
// 从一个商品选中的包装
            List
< pkgselect >  pkgselect  =   null ;
            
// 总共的用量
            
decimal  totalAmount  =  area  *  amount;
           
            Console.WriteLine("你的总共用量是:{
0 }", totalAmount);
            
// 选中的包装个数
            
int  num  =   0 ;
           
            foreach (product p 
in  products)
            {
                
// 计算一个商品包装规格及用量
                budget
= 0 ;
                totalAmount 
=  area  *  amount;
                pkgselect 
=  new List < pkgselect > ();
                proselect 
=  new productSelect()
                {
                    Id 
=  p.Id,
                    PkgSpecs 
=  new List < pkgselect > (),
                    Budget 
=  budget,
                    Name 
=  p.Name
                };
                                    
                foreach (pkgspec pkg 
in  p.PkgSpecs )
                {
                    
if  (totalAmount  %  pkg.amount  ==  totalAmount)
                    {
                        num 
=   1 ;
                        budget 
+=  num  *  pkg.price;
                        pkgselect.
Add (new pkgselect() { id  =  pkg.id, num  =  num, price  =  pkg.price });
                        
break ;
                    }
                    
else   if  (totalAmount  %  pkg.amount  ==   0 )
                    {
                        num 
=  ( int )(totalAmount  /  pkg.amount);
                        budget 
+=  num  *  pkg.price;
                        pkgselect.
Add (new pkgselect() { id  =  pkg.id, num  =  ( int )(totalAmount  /  pkg.amount), price  =  pkg.price });
                        
break ;
                    }
                    
else
                    {
                        num 
=  ( int )(totalAmount  /  pkg.amount);
                        budget 
+=  num  *  pkg.price;
                        pkgselect.
Add (new pkgselect() { id  =  pkg.id, num  =  num, price  =  pkg.price });
                        totalAmount 
=  totalAmount  -  num  *  pkg.amount;
                        
continue ;
                    }
                }
                proselect.PkgSpecs 
=  pkgselect;
                proselect.Budget 
=  budget;
                proselects.
Add (proselect);
            }
            proselects.Sort(compareBudgetAsc);


            foreach (productSelect s 
in  proselects)
            {
                Console.WriteLine("商品 {
0 } 需要 { 1 } 个包装规格,总价是 { 2 }", s.Name, s.PkgSpecs. Count , s.Budget);
            }
            Console.WriteLine("最便宜的是商品 {
0 } ", proselects [ 0 ] .Name);

            foreach (pkgselect s 
in  proselects [ 0 ] .PkgSpecs)
            {
                Console.WriteLine("\t规格 {
0 } , 单价 { 1 }, 需要购买的数量 { 2 }", s.id, s.price, s.num);
            }
            Console.ReadLine();
        }
        
///   < summary >
        
///  从低到高
        
///   </ summary >
        
///   < param name = "pkg1" ></ param >
        
///   < param name = "pkg2" ></ param >
        
///   < returns ></ returns >
        private static 
int  compareAmountAsc(pkgspec pkg1, pkgspec pkg2)
        {
            
if  (pkg1.amount  >  pkg2.amount)
                
return   1 ;
            
if  (pkg1.amount  <  pkg2.amount)
                
return   - 1 ;
            
else
                
return   0 ;
        }
        
///   < summary >
        
///  从高到低
        
///   </ summary >
        
///   < param name = "pkg1" ></ param >
        
///   < param name = "pkg2" ></ param >
        
///   < returns ></ returns >
        private static 
int  compareAmountDesc(pkgspec pkg1, pkgspec pkg2)
        {
            
if  (pkg1.amount  <  pkg2.amount)
                
return   1 ;
            
if  (pkg1.amount  >  pkg2.amount)
                
return   - 1 ;
            
else
                
return   0 ;
        }
        
///   < summary >
        
///  从低到高
        
///   </ summary >
        
///   < param name = "pkg1" ></ param >
        
///   < param name = "pkg2" ></ param >
        
///   < returns ></ returns >
        private static 
int  compareBudgetAsc(productSelect pro1, productSelect pro2)
        {
            
if  (pro1.Budget  >  pro2.Budget)  return   1 ;
            
if  (pro1.Budget  <  pro2.Budget)
                
return   - 1 ;
            
else
                
return   0 ;
        }
        
///   < summary >
        
///  从高到低
        
///   </ summary >
        
///   < param name = "pkg1" ></ param >
        
///   < param name = "pkg2" ></ param >
        
///   < returns ></ returns >
        private static 
int  compareBudgetDesc(productSelect pro1, productSelect pro2)
        {
            
if  (pro1.Budget  <  pro2.Budget)  return   1 ;
            
if  (pro1.Budget  >  pro2.Budget)
                
return   - 1 ;
            
else
                
return   0 ;
        }
    }
    
///   < summary >
    
///  选中的包装
    
///   </ summary >
    class pkgselect
    {
        
///   < summary >
        
///  选中ID
        
///   </ summary >
        
public   int  id;
        
///   < summary >
        
///  购买数量
        
///   </ summary >
        
public   int  num;
        
///   < summary >
        
///  单价
        
///   </ summary >
        
public   decimal  price;
    }
    
///   < summary >
    
///  包装类型
    
///   </ summary >
    class pkgspec : IComparable
< pkgspec >
    {
        
///   < summary >
        
///  编号
        
///   </ summary >
        
public   int  id;
        
///   < summary >
        
///  包装量
        
///   </ summary >
        
public   decimal  amount;
        
///   < summary >
        
///  价格
        
///   </ summary >
        
public   decimal  price;

        #region IComparable
< pkgspec >  Members
        
///   < summary >
        
///  List < pkgspec > .Sort()默认从低到高
        
///   </ summary >
        
///   < param name = "other" ></ param >
        
///   < returns ></ returns >
        
public   int  CompareTo(pkgspec other)
        {
            
if  (this.amount  >  other.amount)
                
return   1 ;
            
if  (this.amount  ==  other.amount)
                
return   0 ;
            
else
                
return   - 1 ;
        }

        #endregion
    }
    
///   < summary >
    
///  代售商品
    
///   </ summary >
    class product
    {
        
///   < summary >
        
///  商品ID
        
///   </ summary >
        
public   int  Id {  set ; get; }
        
///   < summary >
        
///  商品名称
        
///   </ summary >
        
public  string Name {  set ; get; }
        
///   < summary >
        
///  商品包装规格
        
///   </ summary >
        
public  List < pkgspec >  PkgSpecs {  set ; get; }
    }
    
///   < summary >
    
///  选中的商品
    
///   </ summary >
     class productSelect : IComparable
< productSelect >
    {
///   < summary >
        
///  商品ID
        
///   </ summary >
        
public   int  Id {  set ; get; }
        
///   < summary >
        
///  商品名称
        
///   </ summary >
        
public  string Name {  set ; get; }
        
///   < summary >
        
///  需要购买的包装规格
        
///   </ summary >
        
public  List < pkgselect >  PkgSpecs {  set ; get; }
        
///   < summary >
        
///  总价
        
///   </ summary >
        
public   decimal  Budget { get;  set ; }

        #region IComparable
< productSelect >  Members
         
///   < summary >
        
///  List < productSelect > .Sort()默认从低到高
         
///   </ summary >
         
///   < param name = "other" ></ param >
         
///   < returns ></ returns >
        
public   int  CompareTo(productSelect other)
        {
            
if  (this.Budget  >  other.Budget)
                
return   1 ;
            
if  (this.Budget  <  other.Budget)
                
return   - 1 ;
            
else
                
return   0 ;
        }

        #endregion
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值