代码改变世界

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

2010-03-23 12:36  Virus-BeautyCode  阅读(1075)  评论(0编辑  收藏  举报

  

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

  示例图片效果

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

  

代码
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
    }
}