问题描述
业务场景:用户需要购买一批物料进行生产,购买需求如下:物料数量A1A2B3C4B5B6A,B,C三种物料为替代料(随便买哪种都行)请调整物料,使A,B,C调整后的比率最接近(A:B:C=5:3:2)请给出算法或代码,谢谢.
解决方案
解决方案二:
你这是项目,还是家庭作业,怎么那么奇葩呢为什么ABC不是一次性给出数量,而是分成那么多行而如果调整成5:2:3之后,也要跟原来一样分那么多份么?
解决方案三:
只调整A,B,C其他的不要动...且问题一点也不奇葩.
解决方案四:
算比率好算,都加起来,乘上系数,就是每一种的数量了问题是,A1A2如果最终确定A应该买4个,那按什么规律将4个再分成2组?是平均分,还是按比例分?
解决方案五:
引用2楼snow9704的回复:
只调整A,B,C其他的不要动...且问题一点也不奇葩.
这话我就听不懂了.还有其他?我只看到很多个ABC,没看到有其他而只调整ABC,A和B都有好多个,到底调整全部,还是调整哪个?
解决方案六:
需求不明确吧,好模糊不懂
解决方案七:
解答者不需要观需求是如何产生的,只需要管算法如何实现,谢谢。上面的数据只是我给出的测试数据,真实数据集合的长度肯定要多上不少。
解决方案八:
A1A2B3C4B5B6通过算法(现在的问题)得出结果:A1A2A3C4A5B6
解决方案九:
物料这列的数据可以清掉,然后从(A,B,C)任选一种,输出的结果:A:B:C的购买数量无限接近50%:30%:20%就可以了.
解决方案十:
引用6楼snow9704的回复:
解答者不需要观需求是如何产生的,只需要管算法如何实现,谢谢。上面的数据只是我给出的测试数据,真实数据集合的长度肯定要多上不少。
算法是什么?算法是实现需求的需求不明确,谈何算法!
解决方案十一:
好吧,就谈谈需求吧。客户需要生产一批成品物料,通过需求计划及BOM分解出需要购买以下这样的一些物料:x1x2x3x4x5x6其中x表示替代物料组的意思。x替代物料组中包括A,B,C三种具体的物料。也就是说x用A或B或C来替代都可以。但考虑A,B,C的成本及其他因素,购买A,B,C要按照一定的比例购买。即我上面提供的50%:30%:20%来购买。算法执行后提供出一款具体最佳的方案给用户。如:A1A2A3B4B5C6方案的实际比率为6/21:9/21:6:21符合无限接近50%:30%:20%注:可以看出,以上方案不是最佳方案。不想谈需求的原因是:需求我已经进行过分析了,现在已经具体到算法了。
解决方案十二:
如lz测试例子总共21个物品可被替换现在abc要50%30%20%那直接21*0.5=10.5四舍五入11A就11个然后(21-11)*0.6=6B就6个最后C等于4个按这顺序计算一下就好了需要什么复杂的算法吗?你是需求是要11个A6个B4个C在具体分成a:1a:2a:3a:5b:6c:4这样?
解决方案十三:
所以说,需求你还没分析明白.所以方案也出不来.或者你心里知道,但是不会说.x后面的数量是固定的,不可更改,而且行数也是固定的,不可更改,仅仅是将x替换成abc?判断是否最佳方案的标准又是什么?
解决方案十四:
tolaiyongxin:对,就是要得出这样一个结果.具体的代码如何实现,需要动态算,
解决方案十五:
x后面的数量是固定的,不可更改,而且行数也是固定的,不可更改,仅仅是将x替换成abc?回答:对.判断是否最佳方案的标准又是什么?回答:这个目前还没定,暂时考虑计算出实际方案的比率.和希望的比率进行比较,选择偏差值接近0的.
解决方案:
可选的方案应该为X(可替代物料)的N(购买集合的长度)次方.现在遍历输出所有可能方案程序不知道如何写...
解决方案:
引用15楼snow9704的回复:
可选的方案应该为X(可替代物料)的N(购买集合的长度)次方.现在遍历输出所有可能方案程序不知道如何写...
简单啊,递归,有多少行就递归多少次然后每一次里面做个for循环,将当前行分别赋值成A,B,C最终递归完一次,就输出个结果然后算一下比率,记住再出一个结果,和上一次的比较,更优就替换,否则丢弃全部递归完,将最优解输出
解决方案:
能帮忙写下输出所有方案的代码吗?计算最优的代码就不需要了,十分感谢!
解决方案:
递归岂不是要慢死……
解决方案:
引用18楼xd321yes的回复:
递归岂不是要慢死……
快还是慢,是相对的看到底有多少数据,是否能够忍受的时间内算出来,就行了除非你有更好的办法,否则不要光吐槽啊
解决方案:
引用19楼Z65443344的回复:
Quote: 引用18楼xd321yes的回复:
递归岂不是要慢死……快还是慢,是相对的看到底有多少数据,是否能够忍受的时间内算出来,就行了除非你有更好的办法,否则不要光吐槽啊
好吧我承认没有更好的办法了。。。
解决方案:
引用17楼snow9704的回复:
能帮忙写下输出所有方案的代码吗?计算最优的代码就不需要了,十分感谢!
classProgram{string[]re=newstring[6];staticvoidMain(string[]args){Programaa=newProgram();aa.GetMethod("A",0);aa.GetMethod("B",0);aa.GetMethod("C",0);Console.ReadLine();}publicvoidGetMethod(stringA,intn){if(n==6){Output(re);return;}re[n]=A;GetMethod("A",n+1);GetMethod("B",n+1);GetMethod("C",n+1);}publicstaticvoidOutput(string[]re){for(inti=0;i<re.Length;i++){Console.Write(re[i]+"");}Console.WriteLine();}}看着个行不,……
解决方案:
introwsCount=6;string[]resultList=newstring[rowsCount];voidgetValue(intstep,intmaxStep){stringstrValue="";for(inti=0;i<3;i++){switch(step){case0:strValue="A";break;case1:strValue="B";break;case2:strValue="C";break;}resultList[step]=strValue;if(step<maxStep){getValue(step+1,maxStep);}else{foreach(stringsinresultList){Console.WriteLine(s);}}}}
解决方案:
如果需要执行比较并保存结果,写到上面的else里就行了
解决方案:
好的,我试一下.