日期:2014-05-20 浏览次数:21180 次
  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;
    }
}