在指定的持续时间内安排任务算法难题

时间:2017-07-03 09:48:55

标签: algorithm data-structures

我有一个有趣的DS问题,我有一个固定的持续时间( 1小时)和一个可变的持续时间( 1到2小时),我给了一定的数字任务详述如下。如何找到正确的多个任务分组,使它们总计到指定的持续时间。

任务示例: -

  • 任务A - 25分钟,

  • 任务B - 20分钟,

  • 任务C - 25分钟,

  • 任务D - 35分钟。
  • 任务E - 25分钟,
  • 任务F - 30分钟,
  • 任务G - 30分钟。

对于1小时的持续时间,样本答案将是: -

  • 任务F + G
  • 任务D + E

持续1至2小时,样本答案为: -

  • 任务F + G
  • 任务A + B + C

正确的算法可以帮助我识别所有组合。

2 个答案:

答案 0 :(得分:0)

试试这个

TASKS completed in onehour
('A', 'D')
('C', 'D')
('D', 'E')
('F', 'G')
TASKS In RANGE 60-120 minutes
('A', 'D')
('C', 'D')
('D', 'E')
('D', 'F')
('D', 'G')
('F', 'G')
('A', 'B', 'C')
('A', 'B', 'D')
('A', 'B', 'E')
('A', 'B', 'F')
('A', 'B', 'G')
('A', 'C', 'D')
('A', 'C', 'E')
('A', 'C', 'F')
('A', 'C', 'G')
('A', 'D', 'E')
('A', 'D', 'F')
('A', 'D', 'G')
('A', 'E', 'F')
('A', 'E', 'G')
('A', 'F', 'G')
('B', 'C', 'D')
('B', 'C', 'E')
('B', 'C', 'F')
('B', 'C', 'G')
('B', 'D', 'E')
('B', 'D', 'F')
('B', 'D', 'G')
('B', 'E', 'F')
('B', 'E', 'G')
('B', 'F', 'G')
('C', 'D', 'E')
('C', 'D', 'F')
('C', 'D', 'G')
('C', 'E', 'F')
('C', 'E', 'G')
('C', 'F', 'G')
('D', 'E', 'F')
('D', 'E', 'G')
('D', 'F', 'G')
('E', 'F', 'G')
('A', 'B', 'C', 'D')
('A', 'B', 'C', 'E')
('A', 'B', 'C', 'F')
('A', 'B', 'C', 'G')
('A', 'B', 'D', 'E')
('A', 'B', 'D', 'F')
('A', 'B', 'D', 'G')
('A', 'B', 'E', 'F')
('A', 'B', 'E', 'G')
('A', 'B', 'F', 'G')
('A', 'C', 'D', 'E')
('A', 'C', 'D', 'F')
('A', 'C', 'D', 'G')
('A', 'C', 'E', 'F')
('A', 'C', 'E', 'G')
('A', 'C', 'F', 'G')
('A', 'D', 'E', 'F')
('A', 'D', 'E', 'G')
('A', 'D', 'F', 'G')
('A', 'E', 'F', 'G')
('B', 'C', 'D', 'E')
('B', 'C', 'D', 'F')
('B', 'C', 'D', 'G')
('B', 'C', 'E', 'F')
('B', 'C', 'E', 'G')
('B', 'C', 'F', 'G')
('B', 'D', 'E', 'F')
('B', 'D', 'E', 'G')
('B', 'D', 'F', 'G')
('B', 'E', 'F', 'G')
('C', 'D', 'E', 'F')
('C', 'D', 'E', 'G')
('C', 'D', 'F', 'G')
('C', 'E', 'F', 'G')
('D', 'E', 'F', 'G')

输出:

void insert(const T& data, Iterator iterator=end());

答案 1 :(得分:0)

static void showCombinations(int flag,List<String> task,int sum,int start, List<Integer> arr, int n, int r, int eAdded, List<Integer> data, List<Integer> endList) {

    int k = start + 1;
    if (eAdded == r) {

        int temp=0;

        for(int i=0;i<data.size();i++){
            temp+=data.get(i);
        }
         if(temp==sum&&flag==0){

           task.forEach((it)->{
               System.out.print(it);
            });
            System.out.println();

        }
       else if(temp>=sum && temp<=120&&flag==1){

           task.forEach((it)->{
               System.out.print(it);
            });
            System.out.println();

       }

    } else {

        for (int i = start; i <= endList.get(eAdded); i++) {

            data.add(arr.get(i));
            task.add(Character.toString((char) (i+ 65)));

            showCombinations(flag,task,sum,k, arr, n, r, eAdded + 1, data, endList);
            task.remove(task.size() - 1);
            data.remove(data.size() - 1);
            k++;

        }
    }

}
public static void main(String args[]){
    List<Integer> resultList = new ArrayList<>();
    ArrayList<ArrayList<Integer>> values = new ArrayList<>();
    List<Integer> data = new ArrayList<>();

    resultList.add(25); // For each element in resultList the element is 
    resultList.add(20); // taken by a particular task
    resultList.add(25); // 
    resultList.add(35); // 
    resultList.add(25); //
    resultList.add(30); // 
    resultList.add(30); //


    int n=resultList.size();

    List<Integer> end = new ArrayList<>();// List that contains end value for each starting index

    List<String> task=new ArrayList<>();

    System.out.println("These completes within an hour: ");
    for(int k=1;k<=resultList.size();k++){
        for (int i = 0; i <= k; i++) {
        end.add(n - (k) + i);

        }

        showCombinations(0,task, 60, 0, resultList, resultList.size(), k, 0, data, end);
        data.clear();
        end.clear();
        task.clear();
    }
    System.out.println("These completes within 1 to 2 hour(both Inclusive) : ");
        for(int k=1;k<=resultList.size();k++){
        for (int i = 0; i <= k; i++) {
        end.add(n - (k) + i);

        }

        showCombinations(1,task, 60, 0, resultList, resultList.size(), k, 0, data, end);
        data.clear();
        end.clear();
        task.clear();
    }


}

输出:

These completes within an hour: 
AD
CD
DE
FG
These completes within 1 to 2 hour(both Inclusive) : 
AD
CD
DE
DF
DG
FG
ABC
ABD
ABE
ABF
ABG
ACD
ACE
ACF
ACG
ADE
ADF
ADG
AEF
AEG
AFG
BCD
BCE
BCF
BCG
BDE
BDF
BDG
BEF
BEG
BFG
CDE
CDF
CDG
CEF
CEG
CFG
DEF
DEG
DFG
EFG
ABCD
ABCE
ABCF
ABCG
ABDE
ABDF
ABDG
ABEF
ABEG
ABFG
ACDE
ACDF
ACDG
ACEF
ACEG
ACFG
ADEF
ADEG
ADFG
AEFG
BCDE
BCDF
BCDG
BCEF
BCEG
BCFG
BDEF
BDEG
BDFG
BEFG
CDEF
CDEG
CDFG
CEFG
DEFG