日期:2014-05-20 浏览次数:20999 次
public int line(int A,int B, int C,int N){ int Na= 0;//A的最少个数; ...... return Na; }
/** * 最节省材料算法 * @deprecated 最短剩余确保法则 * @author oushuuryuu */ class CaculateBestCutting { private int _baseLength; //标准绳子长度 /** * 构造函数 * @param baseLength 标准绳子长度 */ public CaculateBestCutting(int baseLength) { this._baseLength = baseLength; } /** * 所需最少根数取得 * @param lenA A绳的长度 * @param cntA A绳的数量 * @param lenB B绳的长度 * @param cntB B绳的数量 * @param lenC C绳的长度 * @param cntC C绳的数量 * @return */ public int getMinLinesCount(int lenA, int cntA,int lenB,int cntB,int lenC,int cntC) { int minCount = 0; //所需要标准绳子的长度 int currentLineLen = 0; //当前绳子的长度 int totalWastedLen = 0; //剩余绳子长度 System.out.println("绳子截取开始"); System.out.println("绳子A:长度=" + lenA + " " + "数量=" + cntA); System.out.println("绳子B:长度=" + lenB + " " + "数量=" + cntB); System.out.println("绳子C:长度=" + lenC + " " + "数量=" + cntC); //到绳子全部截取完为止做下面的处理 while (cntA + cntB + cntC > 0) { int paramLenA = cntA>0?lenA:_baseLength + 1; int paramLenB = cntB>0?lenB:_baseLength + 1; int paramLenC = cntC>0?lenC:_baseLength + 1; int cutIndex = getCuttingIndex(currentLineLen, paramLenA, paramLenB, paramLenC); switch (cutIndex) { case 0: //截取绳子A currentLineLen -= lenA; cntA--; System.out.println("截取A绳 剩余长度=" + currentLineLen); break; case 1: //截取绳子B currentLineLen -= lenB; cntB--; System.out.println("截取B绳 剩余长度=" + currentLineLen); break; case 2: //截取绳子C currentLineLen -= lenC; cntC--; System.out.println("截取C绳 剩余长度=" + currentLineLen); break; default: //剩余长度不够截取 totalWastedLen += currentLineLen; currentLineLen = 15; minCount++; System.out.println("取标准绳子 绳子番号=" + minCount); break; } } System.out.println("绳子截取完成"); System.out.println("所需标准绳子条数=" + minCount + " " + "边角料长度=" + totalWastedLen); return minCount; } /** * 取得应该截取的绳子 * @param currentLen 剩余绳子的长度 * @param lenA A绳的长度 * @param lenB B绳的长度 * @param lenC C绳的长度 * @return -1:截取不可 0:截取A绳 1:截取B绳 2:截取C绳 */ private int getCuttingIndex(int currentLen, int lenA, int lenB, int lenC) { int index = -1; //绳子长度由小到大排序 TreeMap<Integer,Integer> sortMap = new TreeMap<Integer,Integer>(); sortMap.put(lenA, 0); sortMap.put(lenB, 1); sortMap.put(lenC, 2); if (sortMap.containsKey(currentLen)) { index = sortMap.get(currentLen); } else { //比currentLen小的最大键值的map取得 Entry<Integer,Integer> targetMap = sortMap.lowerEntry(currentLen); if (targetMap != null) { index = targetMap.getValue(); } } return index; } }