例子1
已知有一批货物,有各种不同的型号:单价分别是:1336;975,800,482,647,307,742,
472,每种型号若干台之后,总数是33605元。
请问如何得知这批货物各多少台,可以对应上33605这个总数?例子2
我要开出来一个总金额为5万的发票,明细的型号单价有:235,500,300,822,523
,447,285等这种价格,每种型号多少数量,总数刚好对成5万就OK数量上分布要比较平均请问此类题目是什么类型的问题,对应的是什么算法呢.

解决方案 »

  1.   

    第一个例子的答案可以是
    307单价15个,742单价20个,472单价30个。
    307*15+742*20+472*30=33605第二个例子的答案还可以是
    523单价2个,447单价77个,285单价51个。
    523*2+447*77+285*51=50000用穷举能算出来。我写的循环如下,但是这个没法均匀分布,一有结果就结算计算了。
    不知道有没有更好的方法
    int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0;
                bool state = false;            
                for (int i = 0; i <= 33605 / 1336; i++)
                {
                    a = i;
                    Console.WriteLine("a={0}", a);
                    if (a * 1336 + b * 975 + c * 800 + d * 482 + e * 647 + f * 307 + g * 742 + h * 472 == 33605)
                    {
                        state = true;
                        break;
                    }
                    else
                    {
                        #region
                        for (int j = 0; j <= (33605 - a * 1336) / 975; j++)
                        {
                            b = j;
                            Console.WriteLine("b={0}", b);
                            if (a * 1336 + b * 975 + c * 800 + d * 482 + e * 647 + f * 307 + g * 742 + h * 472 == 33605)
                            {
                                state = true;
                                break;
                            }
                            else
                            {
                                #region
                                for (int k = 0; k <= (33605 - a * 1336 - b * 975) / 800; k++)
                                {
                                    c = k;
                                    if (a * 1336 + b * 975 + c * 800 + d * 482 + e * 647 + f * 307 + g * 742 + h * 472 == 33605)
                                    {
                                        state = true;
                                        break;
                                    }
                                    else
                                    {
                                        #region
                                        for (int l = 0; l <= (33605 - a * 1336 - b * 975 - c * 800) / 482; l++)
                                        {
                                            d = l;
                                            if (a * 1336 + b * 975 + c * 800 + d * 482 + e * 647 + f * 307 + g * 742 + h * 472 == 33605)
                                            {
                                                state = true;
                                                break;
                                            }
                                            else
                                            {
                                                #region
                                                for (int m = 0; m <= (33605 - a * 1336 - b * 975 - c * 800 - d * 482) / 647; m++)
                                                {
                                                    e = m;
                                                    if (a * 1336 + b * 975 + c * 800 + d * 482 + e * 647 + f * 307 + g * 742 + h * 472 == 33605)
                                                    {
                                                        state = true;
                                                        break;
                                                    }
                                                    else
                                                    {
                                                        #region
                                                        for (int n = 0; n <= (33605 - a * 1336 - b * 975 - c * 800 - d * 482 - e * 647) / 307; n++)
                                                        {
                                                            f = n;
                                                            if (a * 1336 + b * 975 + c * 800 + d * 482 + e * 647 + f * 307 + g * 742 + h * 472 == 33605)
                                                            {
                                                                state = true;
                                                                break;
                                                            }
                                                            else
                                                            {
                                                                #region
                                                                for (int o = 0; o <= (33605 - a * 1336 - b * 975 - c * 800 - d * 482 - e * 647 - f * 307) / 742; o++)
                                                                {
                                                                    g = o;
                                                                    if (a * 1336 + b * 975 + c * 800 + d * 482 + e * 647 + f * 307 + g * 742 + h * 472 == 33605)
                                                                    {
                                                                        state = true;
                                                                        break;
                                                                    }
                                                                    else
                                                                    {
                                                                        for (int p = 0; p <= (33605 - a * 1336 - b * 975 - c * 800 - d * 482 - e * 647 - f * 307 - g * 742) / 472; p++)
                                                                        {
                                                                            h = p;
                                                                            if (a * 1336 + b * 975 + c * 800 + d * 482 + e * 647 + f * 307 + g * 742 + h * 472 == 33605)
                                                                            {
                                                                                state = true;
                                                                                break;
                                                                            }
                                                                        }                                                                    
                                                                    }
                                                                    if (state == true)
                                                                    {
                                                                        break;
                                                                    }
                                                                }
                                                                #endregion                                                            
                                                            } 
                                                            if (state == true)
                                                            {
                                                                break;
                                                            }
                                                        }
                                                        #endregion                                                    
                                                    } 
                                                    if (state == true)
                                                    {
                                                        break;
                                                    }
                                                }
                                                #endregion
                                            }
                                            if (state == true)
                                            {
                                                break;
                                            }
                                        }
                                        #endregion
                                    }
                                    if (state == true)
                                    {
                                        break;
                                    }
                                }
                                #endregion
                            }
                            if (state == true)
                            {
                                break;
                            }
                        }
                        #endregion                   
                    }
                    if (state == true)
                    {
                        break;
                    }
                }
                if (state == true)
                {
                    Console.WriteLine("has get the result");
                    Console.WriteLine("{0}*1336+{1}*975+{2}*800+{3}*482+{4}*647+{5}*307+{6}*742+{7}*472=33605", a, b, c, d, e, f, g, h);
                }
                else
                {
                    Console.WriteLine("no result");
                }
                Console.ReadLine();