C# 数字之间的配比问题,代码该如何写?

filmings 2014-12-15 08:50:49
例:现有A:10 B:12 C:20 D:8
第一次配比可以A:B:C 有10,这时A:剩余0,B:剩余2,C:剩余10,D:剩余8
再进行第二次配比:B:C:D 有2,这时A:剩余0,B:剩余0,C:剩余8,D:剩余6
也就是说,一共可配比两次,最大的配比优化出12个,我想知道,类似这样的逻辑在代码里应该如何写啊?或是有资料提供参考下也行,今天一天在线等大神的回复。
...全文
101 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
int[] seeds因为只是修改内部值,所以不用ref值得变化也会体现在方法调用后,你直接调用两次方法就知道了,至于下标的问题,因为你没有如何组合的规则,所以你需要在方法外部写一段组合规则
引用 8 楼 filmings 的回复:
[quote=引用 6 楼 starfd 的回复:]
/// <summary>
        /// 
        /// </summary>
        /// <param name="seeds">ABCD顺序对应的值,如[10,12,20,8]</param>
        /// <param name="idxs">哪些索引对应的值需要获取最小值</param>
        /// <returns></returns>
        public int GetMinValue(int[] seeds, int[] idxs)
        {
            int minValue = 0;
            if (seeds != null && seeds.Length == 4
                && idxs != null && idxs.Length == 3 && idxs.Max() < 4 && idxs.Min() >= 0 && idxs.Distinct().Count() == 3)
            {
                minValue = Math.Min(seeds[idxs[0]], seeds[idxs[1]]);
                minValue = Math.Min(minValue, seeds[idxs[2]]);
                if (minValue > 0)
                {
                    //已获取最小匹配值,相应位置移除
                    foreach (var i in idxs)
                    {
                        seeds[i] -= minValue;
                    }
                }
            }
            return minValue;
        }
你好,感谢你提供的代码,刚才我试了下,需要指定输入 int[] idxs这个数组中的下标索引,也就是说,每一次获取的时候都需要手动输入,如果能自动进行就最好了,另外,你这个第一个参数的数组在执行一遍后,应该把值保存下来,然后再给第二次去配比,否则,每次都会用到原始的值去计算,不过,还是感谢你的代码意见,我自己再研究下,看看能不能再改进下,感谢,上分。[/quote]
filmings 2014-12-15
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
/// <summary>
        /// 
        /// </summary>
        /// <param name="seeds">ABCD顺序对应的值,如[10,12,20,8]</param>
        /// <param name="idxs">哪些索引对应的值需要获取最小值</param>
        /// <returns></returns>
        public int GetMinValue(int[] seeds, int[] idxs)
        {
            int minValue = 0;
            if (seeds != null && seeds.Length == 4
                && idxs != null && idxs.Length == 3 && idxs.Max() < 4 && idxs.Min() >= 0 && idxs.Distinct().Count() == 3)
            {
                minValue = Math.Min(seeds[idxs[0]], seeds[idxs[1]]);
                minValue = Math.Min(minValue, seeds[idxs[2]]);
                if (minValue > 0)
                {
                    //已获取最小匹配值,相应位置移除
                    foreach (var i in idxs)
                    {
                        seeds[i] -= minValue;
                    }
                }
            }
            return minValue;
        }
你好,感谢你提供的代码,刚才我试了下,需要指定输入 int[] idxs这个数组中的下标索引,也就是说,每一次获取的时候都需要手动输入,如果能自动进行就最好了,另外,你这个第一个参数的数组在执行一遍后,应该把值保存下来,然后再给第二次去配比,否则,每次都会用到原始的值去计算,不过,还是感谢你的代码意见,我自己再研究下,看看能不能再改进下,感谢,上分。
filmings 2014-12-15
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
/// <summary>
        /// 
        /// </summary>
        /// <param name="seeds">ABCD顺序对应的值,如[10,12,20,8]</param>
        /// <param name="idxs">哪些索引对应的值需要获取最小值</param>
        /// <returns></returns>
        public int GetMinValue(int[] seeds, int[] idxs)
        {
            int minValue = 0;
            if (seeds != null && seeds.Length == 4
                && idxs != null && idxs.Length == 3 && idxs.Max() < 4 && idxs.Min() >= 0 && idxs.Distinct().Count() == 3)
            {
                minValue = Math.Min(seeds[idxs[0]], seeds[idxs[1]]);
                minValue = Math.Min(minValue, seeds[idxs[2]]);
                if (minValue > 0)
                {
                    //已获取最小匹配值,相应位置移除
                    foreach (var i in idxs)
                    {
                        seeds[i] -= minValue;
                    }
                }
            }
            return minValue;
        }
呃。。等我试下哈
  • 打赏
  • 举报
回复
/// <summary>
        /// 
        /// </summary>
        /// <param name="seeds">ABCD顺序对应的值,如[10,12,20,8]</param>
        /// <param name="idxs">哪些索引对应的值需要获取最小值</param>
        /// <returns></returns>
        public int GetMinValue(int[] seeds, int[] idxs)
        {
            int minValue = 0;
            if (seeds != null && seeds.Length == 4
                && idxs != null && idxs.Length == 3 && idxs.Max() < 4 && idxs.Min() >= 0 && idxs.Distinct().Count() == 3)
            {
                minValue = Math.Min(seeds[idxs[0]], seeds[idxs[1]]);
                minValue = Math.Min(minValue, seeds[idxs[2]]);
                if (minValue > 0)
                {
                    //已获取最小匹配值,相应位置移除
                    foreach (var i in idxs)
                    {
                        seeds[i] -= minValue;
                    }
                }
            }
            return minValue;
        }
  • 打赏
  • 举报
回复
通过Math.Min来获取最小,代码等VS打开了敲一个
filmings 2014-12-15
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
配比为什么是1:1:1 而且什么能跟什么配,有规律吗 任意3种都可以按1:1:1配?
嗯是的,就是,ABCD之间只能是三个三个的进行配,然后,以每一组中最少的为准,例A:0 B:2 C:5 D:3 因为A为0所以只能是BCD之间进行配,且只能配出2个,
於黾 2014-12-15
  • 打赏
  • 举报
回复
配比为什么是1:1:1 而且什么能跟什么配,有规律吗 任意3种都可以按1:1:1配?
filmings 2014-12-15
  • 打赏
  • 举报
回复
引用 1 楼 lwq222121 的回复:
不好意思,语文老师一直再带我们上体育,没读懂。。。
晕。。。我觉得我写的还是挺清楚的吧,就是ABCD这四数之间进行配比取出最大化
lwq222121 2014-12-15
  • 打赏
  • 举报
回复
不好意思,语文老师一直再带我们上体育,没读懂。。。

110,539

社区成员

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

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

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