首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

一个算法解决方案

2013-08-09 
一个算法7X+5Y一个整数(传入的值)我要得到最优化的X与Y,举例说明例如:如果传入的30,30 7 7 7 5 5最终就是

一个算法
7X+5Y=一个整数(传入的值)我要得到最优化的X与Y,举例说明
例如:如果传入的30,
30 7 7 7 5 5  最终就是X=3 Y=2
传入的是20 ,
20 7 7 7  最终X=3 Y=0
9 5 5 X=0,Y=2
11 5 7 X=1,Y=1
可以这样理解,一个箱子能放7个物件,一个箱子能放5个物件,现在我要根据物件数来分配箱子,
得到最优的分配方式
不知道这样描述,大家能否了解我的意思
算法
[解决办法]
意思就是找满足7X+5Y的值比传入的N大,但是超过量最小的X和Y?
[解决办法]

    class Program
    {
        static void Main(string[] args)
        {

            int X  , Y  ;
            int t1;
            int t2;
            int t1_0 = 0;
            int t2_0 = 0;  
            
            int z = Int32.Parse(Console.ReadLine());
            if (z > 14)
                {
                    for (X = 0; (X-1) * 7 <= z; X++)
                    {
                        for (Y = 0; (Y-1) * 5 <= z; Y++)
                        {
                            if (z <= X * 7 + Y * 5 - 1)


                            {
                                t1 = X + Y;
                                t2 = 7 * X + 5 * Y;
                                if (t1_0 == 0) { t1_0 = t1; }
                                else if (t1 < t1_0) { t1_0 = t1; }                             
                                if (t2_0 == 0) { t2_0 = t2; }
                                else if (t2 < t2_0) { t2_0 = t2; }
                                
                            }
                        }
                    }
                    Console.Out.WriteLine(t1_0);
                    Console.Out.WriteLine(t2_0);
                    X = (t2_0 - 5 * t1_0) / 2;


                    Y = t1_0 - X;
                    Console.Out.WriteLine("X = " + X + "Y =" + Y);
                }
                else if(z<=14)
                {
                    X = 0; Y = 0;
                    if (z <= 5) { X = 0; Y = 1; }
                    else if (z >= 6 && z <= 7) { X = 1; Y = 0; }
                    else if (z >= 8 && z <= 10) { X = 0; Y = 2; }
                    else if (z >= 11 && z <= 12) { X = 1; Y = 1; }
                    else if (z >= 13 && z <= 14) { X = 2; Y = 0; }
                    Console.Out.WriteLine("X = " + X + "Y =" + Y);
                }          
            Console.ReadLine();

        }
    }


[解决办法]
class Program
    {
        static int  x=0,y=0;
        static void Main(string[] args)


        {
            string stra = Console.ReadLine();
            int n = Convert.ToInt32(stra);
            function(n);
            Console.WriteLine("{0},{1}", x, y);
            Console.ReadLine();        
        }
        public static void function(int temp)
        {
            x = temp / 7;       //保证x+y最小
            temp = temp - (7 * x);
            if (temp > 5) { x++; }
            else if (temp > 3) { y++; } 
            else if (temp > 0)  //保证y最大
            {
                y++;
                if (x > 0) { y++; x--; }
            }
        }
    }


感觉还比楼上简单点啊
[解决办法]
引用:
经过大家的协助,先分享出通用版本

int X, Y;
            int t1;
            int t2;  
            DataTable dtresult = new DataTable();
            dtresult.Columns.Add("X");
            dtresult.Columns.Add("Y");
            DataRow drresult = null;
            if (snum1 > snum2)


            {
                for (X = 0; (X - 1) * snum1 <= sum; X++)
                {
                    for (Y = 0; (Y - 1) * snum2 <= sum; Y++)
                    {
                        if (sum <= X * snum1 + Y * snum2)
                        {
                            t1 = X + Y;
                            t2 = snum1 * X + snum2 * Y;
                            drresult = dtresult.NewRow();
                            drresult["X"] = X.ToString();
                            drresult["Y"] = Y.ToString();
                            dtresult.Rows.Add(drresult);
                        }
                    }
                }
            }
            else
            {
                for (X = 0; (X - 1) * snum2 <= sum; X++)


                {
                    for (Y = 0; (Y - 1) * snum1 <= sum; Y++)
                    {
                        if (sum <= X * snum2 + Y * snum1)
                        {
                            t1 = X + Y;
                            t2 = snum2 * X + snum1 * Y;
                            drresult = dtresult.NewRow();
                            drresult["X"] = X.ToString();
                            drresult["Y"] = Y.ToString();
                            dtresult.Rows.Add(drresult);
                        }
                    }
                }
            } 
            int sumxy = 0;
            int summin = 0;
            int sumabs = 0;
            int resultX = 0;
            int resultY = 0;


            if (snum1 > snum2)
            {
                for (int m = 0; m < dtresult.Rows.Count; m++)
                {
                    int SX = Convert.ToInt32(dtresult.Rows[m]["X"].ToString());
                    int SY = Convert.ToInt32(dtresult.Rows[m]["Y"].ToString());
                    sumxy = snum1 * SX + snum2 * SY;
                    sumabs = Math.Abs(sumxy - sum);
                    if (m == 0) { summin = sumabs; resultX = SX; resultY = SY; }
                    else if (summin > sumabs) { summin = sumabs; resultX = SX; resultY = SY; }

                }
            }
            else
            {
                for (int m = 0; m < dtresult.Rows.Count; m++)
                {
                    int SX = Convert.ToInt32(dtresult.Rows[m]["X"].ToString());
                    int SY = Convert.ToInt32(dtresult.Rows[m]["Y"].ToString());
                    sumxy = snum2 * SX + snum1 * SY;
                    sumabs = Math.Abs(sumxy - sum);


                    if (m == 0) { summin = sumabs; resultX = SX; resultY = SY; }
                    else if (summin > sumabs) { summin = sumabs; resultX = SX; resultY = SY; }

                }
            }


如有不足之处请大家指点


以下几组有没有符合你1L的要求?

total-30: box1(7)-4; box2(5)-1
30:     7       7       7       7       5
total-30: box1(7)-4; box2(6)-1
30:     7       7       7       7       6
total-20: box1(7)-3; box2(5)-0
20:     7       7       7
total-20: box1(6)-3; box2(5)-1
20:     6       6       6       5
Press any key to continue

[解决办法]
我思路是这样的 先算出最少需要多少个篮子
也就是7x=n(n是需要装箱的个数)

 int x=Math.Ceil(n/7);

然后计算在最小数x之内装5个的箱子最大时就是最优解

 int m=0;
 for(int i=x;i>=0;i--)
{
    if(7*x+5*m>=n)
    {
        m++;            
    }
    else
    {
        return;   
    }
}

最优解就是 i与m-1

热点排行