已知总数和几个商品总价,查找每个商品各取几个可以最接近或等于总价,实现程序

发布时间:2022-06-28 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了已知总数和几个商品总价,查找每个商品各取几个可以最接近或等于总价,实现程序脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //10个试剂
            var materialList = new List<Material>();
            for(int i=0;i<10; i++)
            {
                var material = new Material() {
                    Code = i + 1,
                    Name = "Material" + (i + 1).ToString(),
                    Price = (i+1),
                };
                materialList.Add(material);
                material.QtyList = new List<int>();
                int j = 0;
                //最多取20个
                while(j<=20)
                {
                    material.QtyList.Add(j);
                    j++;
                }
            }

            Console.WriteLine($"MaterialList = {Newtonsoft.Json.JsonConvert.SerializeObject(materialList)}");
            decimal total = 0;
            plus(new Diff(), materialList, total);
            var diff = DiffList.OrderBy(p => p.DiffAmt).FirstOrDefault();
            Console.ReadLine();
        }

        public static int totalAmount = 555;
        public static List<Diff> DiffList = new List<Diff>();
        public static bool flag = false;
        public static void plus(Diff diff, List<Material> materialList, decimal total)
        {
            if (flag)
                return;

            if (materialList != null && materialList.Any())
            {
                var material = materialList.First();
                var list = materialList.Where(p=>p.Code != material.Code).ToList();
                foreach (var qty in material.QtyList)
                {
                    if (flag)
                        break;

                    if(totalAmount >= material.Price * qty + total)
                    {
                        var oldTotal = total;
                        oldTotal += material.Price * qty;
                        UpdateDiff(diff, material.Code, qty);
                        if(list.Any())
                            plus(diff, list, oldTotal);
                        else
                        {
                            diff.DiffAmt = totalAmount - oldTotal;
                            DiffList.Add(new Diff()
                            {
                                Number1 = diff.Number1,
                                Number2 = diff.Number2,
                                Number3 = diff.Number3,
                                Number4 = diff.Number4,
                                Number5 = diff.Number5,
                                Number6 = diff.Number6,
                                Number7 = diff.Number7,
                                Number8 = diff.Number8,
                                Number9 = diff.Number9,
                                Number10 = diff.Number10,
                                DiffAmt = diff.DiffAmt
                            });
                            Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(diff));
                            if (diff.DiffAmt == 0)
                            {
                                flag = true;
                                break; 
                            }
                        }
                    }
                }
            }
        }

        public static void UpdateDiff(Diff diff, int index, int qty)
        {
            var propName = "Number" + index.ToString();
            if(diff.GetType().GetProperty(propName) != null)
            {
                diff.GetType().GetProperty(propName).SetValue(diff, qty);
            }
        }

        public static void showLog(List<int> list)
        {
            string str = string.Join(",", list.ToArray());
            Console.WriteLine(str);
        }
    }

    public class Material
    {
        public int Code { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public int Qty { get; set; }
        public List<int> QtyList { get; set; }
    }

    public class Diff
    {
        public int Number1 { get; set; }
        public int Number2 { get; set; }
        public int Number3 { get; set; }
        public int Number4 { get; set; }
        public int Number5 { get; set; }
        public int Number6 { get; set; }
        public int Number7 { get; set; }
        public int Number8 { get; set; }
        public int Number9 { get; set; }
        public int Number10 { get; set; }
        public decimal DiffAmt { get; set; }
    }
}

  

脚本宝典总结

以上是脚本宝典为你收集整理的已知总数和几个商品总价,查找每个商品各取几个可以最接近或等于总价,实现程序全部内容,希望文章能够帮你解决已知总数和几个商品总价,查找每个商品各取几个可以最接近或等于总价,实现程序所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: