【砝码均衡问题】算法大牛支持,各种大神请进

邱_子墨 2014-08-08 09:47:47

///
///参数:
/// Weight:砝码数组(砝码重量不限,重量随机整数)
/// BoxCount:盒子总数
/// 满足条件:
/// 1.每个盒子里面的总重量尽量相等
/// 2.保证盒子两两之间重量的差值所有求和最小
///
AverageEveryBoxWeight(int[] Weight,int BoxCount)
{
//TODO
}

...全文
536 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiannailu 2014-08-08
  • 打赏
  • 举报
回复
1、先将从大到小数组排序。 2、从数组中取砝码放到重量最小的盒子中。
邱_子墨 2014-08-08
  • 打赏
  • 举报
回复
引用 7 楼 l397870376 的回复:
以我的智商完全想不出来
故意的吗?
於黾 2014-08-08
  • 打赏
  • 举报
回复
引用 6 楼 aki_qs 的回复:
[quote=引用 5 楼 Z65443344 的回复:] 以我的数学知识,我只能想出暴力遍历...
能说个大致的思路吗?[/quote] 就是所有排列组合都试一遍,然后把结果暂时存放起来,每试一个方案,就判断一下是否更优,最后只保留最优解
_小黑_ 2014-08-08
  • 打赏
  • 举报
回复
以我的智商完全想不出来
邱_子墨 2014-08-08
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
以我的数学知识,我只能想出暴力遍历...
能说个大致的思路吗?
於黾 2014-08-08
  • 打赏
  • 举报
回复
以我的数学知识,我只能想出暴力遍历...
於黾 2014-08-08
  • 打赏
  • 举报
回复
这是纯粹的数学问题...
邱_子墨 2014-08-08
  • 打赏
  • 举报
回复
引用 2 楼 q107770540 的回复:
is this your homework?
对啊,大牛,我都想好久了,没点思路啊,求指教!!!!
q107770540 2014-08-08
  • 打赏
  • 举报
回复
is this your homework?
邱_子墨 2014-08-08
  • 打赏
  • 举报
回复
引用 21 楼 Z65443344 的回复:
[quote=引用 20 楼 rhjyy 的回复:] 弱弱的问一下:第一个条件和第二个条件是否有相关性,如果有那岂不是冗余条件?如果没有那是否应该再加一个当两者冲突时以谁为准的条件?
其实1和2说的是一个意思,2是作为1的补充,实际上就是判定标准[/quote] 正解
於黾 2014-08-08
  • 打赏
  • 举报
回复
引用 20 楼 rhjyy 的回复:
弱弱的问一下:第一个条件和第二个条件是否有相关性,如果有那岂不是冗余条件?如果没有那是否应该再加一个当两者冲突时以谁为准的条件?
其实1和2说的是一个意思,2是作为1的补充,实际上就是判定标准
rhjyy 2014-08-08
  • 打赏
  • 举报
回复
弱弱的问一下:第一个条件和第二个条件是否有相关性,如果有那岂不是冗余条件?如果没有那是否应该再加一个当两者冲突时以谁为准的条件?
邱_子墨 2014-08-08
  • 打赏
  • 举报
回复
引用 17 楼 tiannailu 的回复:
[quote=引用 16 楼 aki_qs 的回复:] [quote=引用 11 楼 tiannailu 的回复:] [quote=引用 10 楼 tiannailu 的回复:] 1、先将从大到小数组排序。 2、从数组中取砝码放到重量最小的盒子中。

        /// 
        ///参数:
        ///        Weight:砝码数组(砝码重量不限,重量随机整数) 
        ///        BoxCount:盒子总数  
        /// 满足条件:
        ///         1.每个盒子里面的总重量尽量相等 
        ///         2.保证盒子两两之间重量的差值所有求和最小 
        /// 
        private void AverageEveryBoxWeight(int[] weights, int boxCount)
        {
            //TODO 
            //排序
            int maxWeight = int.MinValue;
            int maxIndex = 0;
            for (int i = 0; i < weights.Length -1; i++)
            {
                maxWeight = weights[i];
                maxIndex = i;
                for (int j = i + 1; j < weights.Length; j++)
                {
                    if (weights[j] > maxWeight)
                    {
                        maxWeight = weights[j];
                        maxIndex = j;
                    }
                }
                if (i != maxIndex)
                {
                    int temp = weights[i];
                    weights[i] = weights[maxIndex];
                    weights[maxIndex] = temp;
                }
            }
            List<Box> boxList = new List<Box>();
            for (int i = 0; i < boxCount; i++)
            {
                boxList.Add(new Box());
            }

            //放到盒子中
            int minSum = 0;
            int minIndex = 0;
            for (int i = 0; i < weights.Length; i++)
            {
                minSum = int.MaxValue;
                for (int j = 0; j < boxCount; j++)
                {
                    if (boxList[j].Sum < minSum)
                    {
                        minSum = boxList[j].Sum;
                        minIndex = j;
                    }
                }
                boxList[minIndex].Add(weights[i]);
            }
           
        }

    public class Box
    {
        public int Sum
        {
            get { return _sum; }
        }

        public void Add(int Num)
        {
            _boxList.Add(Num);
            _sum += Num;
        }

        private int _sum = 0;
        private List<int> _boxList = new List<int>();
              
    }
[/quote] 3, 6, 6, 7, 8 这几个数放两个盘子 最优的是8,7 和6,6,3 但是你程序计算出的是: 盒子:1 总数: 14 里面的砝码分别是:8 6 盒子:2 总数: 16 里面的砝码分别是:7 6 3 [/quote] 我擦,非要最优解么? 不过可以在贪婪算法分配完毕后进行调整。[/quote] 之前我的想法是一样的,但是被上面这个打败,就想到应该有后面的调整,但是就是不知道怎么弄了
游离失所 2014-08-08
  • 打赏
  • 举报
回复
这问题有点意思。。算法小白表示压力很大。。看看有没大牛给些好的思路
tiannailu 2014-08-08
  • 打赏
  • 举报
回复
引用 16 楼 aki_qs 的回复:
[quote=引用 11 楼 tiannailu 的回复:] [quote=引用 10 楼 tiannailu 的回复:] 1、先将从大到小数组排序。 2、从数组中取砝码放到重量最小的盒子中。

        /// 
        ///参数:
        ///        Weight:砝码数组(砝码重量不限,重量随机整数) 
        ///        BoxCount:盒子总数  
        /// 满足条件:
        ///         1.每个盒子里面的总重量尽量相等 
        ///         2.保证盒子两两之间重量的差值所有求和最小 
        /// 
        private void AverageEveryBoxWeight(int[] weights, int boxCount)
        {
            //TODO 
            //排序
            int maxWeight = int.MinValue;
            int maxIndex = 0;
            for (int i = 0; i < weights.Length -1; i++)
            {
                maxWeight = weights[i];
                maxIndex = i;
                for (int j = i + 1; j < weights.Length; j++)
                {
                    if (weights[j] > maxWeight)
                    {
                        maxWeight = weights[j];
                        maxIndex = j;
                    }
                }
                if (i != maxIndex)
                {
                    int temp = weights[i];
                    weights[i] = weights[maxIndex];
                    weights[maxIndex] = temp;
                }
            }
            List<Box> boxList = new List<Box>();
            for (int i = 0; i < boxCount; i++)
            {
                boxList.Add(new Box());
            }

            //放到盒子中
            int minSum = 0;
            int minIndex = 0;
            for (int i = 0; i < weights.Length; i++)
            {
                minSum = int.MaxValue;
                for (int j = 0; j < boxCount; j++)
                {
                    if (boxList[j].Sum < minSum)
                    {
                        minSum = boxList[j].Sum;
                        minIndex = j;
                    }
                }
                boxList[minIndex].Add(weights[i]);
            }
           
        }

    public class Box
    {
        public int Sum
        {
            get { return _sum; }
        }

        public void Add(int Num)
        {
            _boxList.Add(Num);
            _sum += Num;
        }

        private int _sum = 0;
        private List<int> _boxList = new List<int>();
              
    }
[/quote] 3, 6, 6, 7, 8 这几个数放两个盘子 最优的是8,7 和6,6,3 但是你程序计算出的是: 盒子:1 总数: 14 里面的砝码分别是:8 6 盒子:2 总数: 16 里面的砝码分别是:7 6 3 [/quote] 我擦,非要最优解么? 不过可以在贪婪算法分配完毕后进行调整。
邱_子墨 2014-08-08
  • 打赏
  • 举报
回复
引用 11 楼 tiannailu 的回复:
[quote=引用 10 楼 tiannailu 的回复:] 1、先将从大到小数组排序。 2、从数组中取砝码放到重量最小的盒子中。

        /// 
        ///参数:
        ///        Weight:砝码数组(砝码重量不限,重量随机整数) 
        ///        BoxCount:盒子总数  
        /// 满足条件:
        ///         1.每个盒子里面的总重量尽量相等 
        ///         2.保证盒子两两之间重量的差值所有求和最小 
        /// 
        private void AverageEveryBoxWeight(int[] weights, int boxCount)
        {
            //TODO 
            //排序
            int maxWeight = int.MinValue;
            int maxIndex = 0;
            for (int i = 0; i < weights.Length -1; i++)
            {
                maxWeight = weights[i];
                maxIndex = i;
                for (int j = i + 1; j < weights.Length; j++)
                {
                    if (weights[j] > maxWeight)
                    {
                        maxWeight = weights[j];
                        maxIndex = j;
                    }
                }
                if (i != maxIndex)
                {
                    int temp = weights[i];
                    weights[i] = weights[maxIndex];
                    weights[maxIndex] = temp;
                }
            }
            List<Box> boxList = new List<Box>();
            for (int i = 0; i < boxCount; i++)
            {
                boxList.Add(new Box());
            }

            //放到盒子中
            int minSum = 0;
            int minIndex = 0;
            for (int i = 0; i < weights.Length; i++)
            {
                minSum = int.MaxValue;
                for (int j = 0; j < boxCount; j++)
                {
                    if (boxList[j].Sum < minSum)
                    {
                        minSum = boxList[j].Sum;
                        minIndex = j;
                    }
                }
                boxList[minIndex].Add(weights[i]);
            }
           
        }

    public class Box
    {
        public int Sum
        {
            get { return _sum; }
        }

        public void Add(int Num)
        {
            _boxList.Add(Num);
            _sum += Num;
        }

        private int _sum = 0;
        private List<int> _boxList = new List<int>();
              
    }
[/quote] 3, 6, 6, 7, 8 这几个数放两个盘子 最优的是8,7 和6,6,3 但是你程序计算出的是: 盒子:1 总数: 14 里面的砝码分别是:8 6 盒子:2 总数: 16 里面的砝码分别是:7 6 3
衣舞晨风 2014-08-08
  • 打赏
  • 举报
回复
引用 11 楼 tiannailu 的回复:
[quote=引用 10 楼 tiannailu 的回复:] 1、先将从大到小数组排序。 2、从数组中取砝码放到重量最小的盒子中。

        /// 
        ///参数:
        ///        Weight:砝码数组(砝码重量不限,重量随机整数) 
        ///        BoxCount:盒子总数  
        /// 满足条件:
        ///         1.每个盒子里面的总重量尽量相等 
        ///         2.保证盒子两两之间重量的差值所有求和最小 
        /// 
        private void AverageEveryBoxWeight(int[] weights, int boxCount)
        {
            //TODO 
            //排序
            int maxWeight = int.MinValue;
            int maxIndex = 0;
            for (int i = 0; i < weights.Length -1; i++)
            {
                maxWeight = weights[i];
                maxIndex = i;
                for (int j = i + 1; j < weights.Length; j++)
                {
                    if (weights[j] > maxWeight)
                    {
                        maxWeight = weights[j];
                        maxIndex = j;
                    }
                }
                if (i != maxIndex)
                {
                    int temp = weights[i];
                    weights[i] = weights[maxIndex];
                    weights[maxIndex] = temp;
                }
            }
            List<Box> boxList = new List<Box>();
            for (int i = 0; i < boxCount; i++)
            {
                boxList.Add(new Box());
            }

            //放到盒子中
            int minSum = 0;
            int minIndex = 0;
            for (int i = 0; i < weights.Length; i++)
            {
                minSum = int.MaxValue;
                for (int j = 0; j < boxCount; j++)
                {
                    if (boxList[j].Sum < minSum)
                    {
                        minSum = boxList[j].Sum;
                        minIndex = j;
                    }
                }
                boxList[minIndex].Add(weights[i]);
            }
           
        }

    public class Box
    {
        public int Sum
        {
            get { return _sum; }
        }

        public void Add(int Num)
        {
            _boxList.Add(Num);
            _sum += Num;
        }

        private int _sum = 0;
        private List<int> _boxList = new List<int>();
              
    }
[/quote] 漂亮
於黾 2014-08-08
  • 打赏
  • 举报
回复
引用 13 楼 wanghui0380 的回复:
把一堆大小不一的重量不一的石头放到一圆盘上,然后圆盘自己做匀加速度运动,当然石头会自己向4面八方抛射,而抛射的结果基本上就是你要结果(上帝是公平滴,概率是公平滴,他可不会偏袒任何一个象限)
随机算法不靠谱吧,每次结果都不同 也有小概率是所有石头都落到一面去
wanghui0380 2014-08-08
  • 打赏
  • 举报
回复
把一堆大小不一的重量不一的石头放到一圆盘上,然后圆盘自己做匀加速度运动,当然石头会自己向4面八方抛射,而抛射的结果基本上就是你要结果(上帝是公平滴,概率是公平滴,他可不会偏袒任何一个象限)
於黾 2014-08-08
  • 打赏
  • 举报
回复
引用 10 楼 tiannailu 的回复:
1、先将从大到小数组排序。 2、从数组中取砝码放到重量最小的盒子中。
好办法.
加载更多回复(1)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧