如何在C#中执行排列和组合 [英] How to perform permutation and combination in C#

查看:82
本文介绍了如何在C#中执行排列和组合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所需数量:530

允许的缓冲区数量为:所需数量的-5%至+ 10%变为:

583 + 10%

503.5 -5%



BATCH |数量



B1 | 510

B2 | 500

B3 | 15

B4 | 12

B5 | 10





所以这里我想要的所有组合都介于503.5和之间。 583.



例如:510,510 + 15,510 + 15 + 12,510 + 15 + 12 + 10,510 + 12,510 + 12 + 10,510 + 10,500 + 15 ......等等。



请帮忙。上述示例的代码将受到高度赞赏。迫切需要。



我尝试了什么:



Required Quantity : 530
Buffer Qty allowed is : -5% to +10% of Required Qty which becomes :
583 for +10%
503.5 for -5%

BATCH | QTY

B1 | 510
B2 | 500
B3 | 15
B4 | 12
B5 | 10


So here i want all the combinations that fall between 503.5 & 583.

Eg : 510,510+15,510+15+12,510+15+12+10,510+12,510+12+10,510+10,500+15 ... etc and so on.

Please help. Code for the above example would be highly appreciated. In urgent need.

What I have tried:

foreach (DataRow row in ObjTempOfferDt.Rows)
                    {
                        DataRow dr = ObjOfferDt.NewRow();
                        dr["ProductId"] = row["ProductId"].ToString();
                        UpperLimit = ReqQnt + ReqQnt * Convert.ToDecimal(0.1);
                        LowerLimit = ReqQnt - ReqQnt * Convert.ToDecimal(0.05);
                        strQuantity = Convert.ToDecimal(row["Quantity"].ToString());
                        if (strQuantity <= ReqQnt && strQuantity != 0 && (strQuantity + Quantity) < UpperLimit)
                        {
                            Quantity = Quantity + Convert.ToDecimal(row["Quantity"].ToString());
                        }
                        else if (strQuantity == 0)
                        {
                            continue;
                        }
                        //Abrar for test 
                        else if (Quantity > ReqQnt && Quantity < UpperLimit)
                        {                            
                            break;
                        }
                        else
                        {
                            continue;
                        }

                        if (ReqQnt == Quantity)
                        {


                            Pieces = Pieces + 1;
                            dr["OfferPercent"] = "0";
                            dr["Batch"] = row["Batch"].ToString();
                            dr["Quantity"] = row["Quantity"].ToString();
                            dr["TotalQuantity"] = Quantity;
                            dr["NoOfPiece"] = Pieces.ToString();
                            ObjOfferDt.Rows.Add(dr);
                            break;
                        }
                        else if (ReqQnt < Quantity && Quantity <= UpperLimit)
                        {
                            dr["OfferPercent"] = "10";
                        }
                        else if (ReqQnt < Quantity && Quantity > UpperLimit)
                        {

                            continue;
                        }
                        else if (ReqQnt > Quantity && Quantity >= LowerLimit)
                        {
                            dr["OfferPercent"] = "10";
                        }
                        else if (Quantity > ReqQnt && Quantity < UpperLimit)
                        {
                            Pieces = Pieces + 1;
                            dr["OfferPercent"] = "0";
                            dr["Batch"] = row["Batch"].ToString();
                            dr["Quantity"] = row["Quantity"].ToString();
                            dr["TotalQuantity"] = Quantity;
                            dr["NoOfPiece"] = Pieces.ToString();
                            ObjOfferDt.Rows.Add(dr);
                          
                            break;
                        }

                        else
                        {
                            if (strQuantity == 0)
                            {
                                continue;
                            }
                            else if (strQuantity > UpperLimit)
                            {
                                continue;
                            }
                            else
                            {
                                Pieces = Pieces + 1;
                                dr["OfferPercent"] = "0";
                                dr["Batch"] = row["Batch"].ToString();
                                dr["Quantity"] = row["Quantity"].ToString();
                                dr["TotalQuantity"] = Quantity;
                                dr["NoOfPiece"] = Pieces.ToString();
                                ObjOfferDt.Rows.Add(dr);
                                continue;
                            }
                        }
                        dr["Batch"] = row["Batch"].ToString();
                        dr["Quantity"] = row["Quantity"].ToString();
                        dr["TotalQuantity"] = Quantity;
                        Pieces = Pieces + 1;
                        dr["NoOfPiece"] = Pieces.ToString();
                        ObjOfferDt.Rows.Add(dr);

                    }







这只是带来第一个满意的数量而不是组合of qty。




This just brings the first satisfied qty not a combination of qty.

推荐答案

我建​​议你

  • 使用数组来保存有意义的数量以简化代码外观
  • 尝试使用递归方法解决问题(例如,参见:使用C#的递归方法 [ ^ ])
I suggest you to
  • Use arrays to hold meaningful quantities in order to simplify the code appearence
  • Try to solve the problem with a recursive approach (see, for instance: Recursive methods using C#[^])


这篇关于如何在C#中执行排列和组合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆