Найти самый комбинаций двух чисел, которые равны третьей или приблизиться к нему


Моя задача-найти, как много разных "задач" можно сделать, если у меня есть два типа задач, которые принимают конкретное время и время, чтобы завершить все из них. Я должен найти самые задачи, что можно сделать так, что зазор между момент и сумма задач является минимальным. Например изучить эти материалы:

3 5 55

И выход(2х5 + 15х3):

17

Или:

Input: 886 340 6177, Output: 10

Также:

Input: 3 5 54, Output: 18

Мой код такой:

 import java.util.Scanner;
 public class Protsessor {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt(); //Time of first task
        int n = in.nextInt(); //Time of second task
        int t = in.nextInt(); //Time available

        int tmpgap;
        int gap = t;
        int tasks = 0;
        int t1  = t;

        if( m <= 0|| n <= 0) { //If input is 0 or less
            System.out.println(0);
            System.exit(0);
        }
        if(m > n) { //I rearrange my input as it doesn't work when m is bigger then n
            int tmp = m;
            m = n;
            n = tmp;
        }
        for (int i = 0; i < (t/m+1); i++) {
            int tmptasks = 0;
            t1 -= i*m;
            tmptasks += i;
            for (int j = 0; j < (t/n+1) && t1 >= n; j++) {
                t1 -= n;
                tmptasks++;
            }
            tmpgap = t1;
            if(tmpgap <= gap){
                gap = tmpgap;
                tasks = tmptasks;
            }
            t1 = t;

        }
        System.out.println(tasks);
    }
}

Как мой код довольно грязный, как я могу оптимизировать/улучшить его с помощью динамического программирования?

Примечание: эта задача в урок программирования конкурентные, я уже представила этот код(прошел).



Комментарии
1 ответ

Вы просто пытались разбить код на более мелкие функции?

int t = in.nextInt(); //Time available

Как насчет просто назвав его timeAvailable вместо t ?

if(m > n) { //I rearrange my input as it doesn't work when m is bigger then n
int tmp = m;
m = n;
n = tmp;
}

Общий шаблон-это что-то вроде:

int calculate(int m, int n, int t) {
if (m > n) {
return calculate(n, m, t);
}
...
}

Попробуйте объявить переменные в минимально возможный объем - int tmpgap; должно быть в цикле for. Внутренний цикл for может быть заменен делением + математика.пол().

1
ответ дан 5 марта 2018 в 04:03 Источник Поделиться