最近有这么一个需求,就是给出客户需要的总量,然后根据数据库记录的包装规格,计算出客户需要购买的包装规格种类和个数,而且要保证客户的花费最小。
示例图片效果
![](https://i-blog.csdnimg.cn/blog_migrate/213d2b5afd8c196ab31a28ae40e44a42.jpeg)
示例代码实现如下。欢迎大家一起讨论。
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.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
}
}
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
}
}