共有三个箱子分别容量为200、500、1000 ;物品有四个重量分别为150、200、300、800;
要求一次装箱把所有物品装完、箱子可以有空的,请问一共有多少种算法?
输出例子:
第一种装箱 : 箱子:1000 500 200 利用率:90%
物品:800+200 300+150 0
第二种装箱 : 箱子:1000 500 200 利用率:95%
物品:800+150 300+200 0
第三种装箱 : 箱子:1000 500 200 利用率:78%
物品:800 300+200 150
第四种装箱 : 箱子:1000 500 200 利用率:85%
物品:800 300+150 200
这个例子太简单,都不用什么算法,800只能在第三个箱子,300只能在第二个箱子。也就150和200在3个位置的选,因为重量不一样有顺序:A32 = 3*2。
这只是箱子和物品少的情况,要是数量多不能口算咧,逻辑都知道,问题是不好实现代码。
@_陈晨: 看到这题目我第一个想到的就是迷宫求解,给你提供一个穷举法,用递归的思想来解决。 代码随便写的,方便理解思路,
function findPathCount (blockList, boxList){ //排序将块按重量从小到大排序,箱子从小到大排序 sortBlock(blockList); sortBoxList(boxList); var pathCount = 0; //取出最大的块 var currentBlock = blockList.pop(); //计算次数 for(var countBox = 0;countBox < boxList.length;countBox++) { //当前块的重量小于箱子的最大容量,则计算路径数量 if(currentBlock.weight < boxList[countBox].capacity) { //如果没有多余的块,满足条件,合理路径+1 if(blockList.length == 0){ pathCount += 1; } else { //将箱子数组复制一份,方便递归计算 var copyBox = boxList.copy(); copyBox[countBox].capacity = copyBox[countBox].capacity - currentBlock.weight pathCount += findPathCount(blockList,copyBox); } } } return pathCount; }
@Gtctuo:谢谢你的建议和方法,但是还是感觉不对,要求最大利用率和多种装箱方式。
自己慢慢琢磨把
多背包问题,可用遗传算法