Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 30.06.2017
Сообщений: 126
1

Рекурсивный перебор

13.12.2018, 04:32. Показов 2963. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, решаю задачу о рюкзаке и не могу понять почему возвращает все время 0. Имеется следующий код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.ArrayList;
 
 
public class Main {
    static ArrayList<Item> items = new ArrayList<>();
    static Backpack bag;
    static final int MAX_WEIGHT = 80;
 
 
    static Item[] goods = {
            new Item("",15, 30),
            new Item("", 30, 90),
            new Item("",50, 100)
    };
 
    public static void main(String[] args) {
        bag = new Backpack(80);
 
        items.add(new Item("Bed", 7, 8));
        items.add(new Item("Chair", 4, 3));
        items.add(new Item("Clock", 2, 9));
 
        //  12 (4, 2)
        System.out.println(combine(items.size()-1, bag.getMaxW()));
 
 
    }
 
    private static double combine(int len, double weight){
        if (len < 0)
            return 0;
        if (items.get(len).getWeight() > weight)
            return combine(len-1, weight);
        else
            return Math.max(combine(len-1, weight), combine(len - 1, weight - items.get(len).getWeight()) + items.get(len).getValue());
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Item {
    private String name;
    private double weight;
    private double value;
 
    public Item(String name, double weight, double value) {
        this.name = name;
        this.weight = weight;
    }
 
    public String getName() {
        return name;
    }
 
    public double getWeight() {
        return weight;
    }
 
    public double getValue() {
        return value;
    }
 
    public void setWeight(double weight) {
        this.weight = weight;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setValue(double value) {
        this.value = value;
    }
}

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.List;
 
public class Backpack {
    private double maxW;
    private double maxC;
    private List<Item> bestItems = null;
 
    public Backpack(double maxW){
        this.maxW = maxW;
 
    }
 
    public double getMaxW(){
        return this.maxW;
    }
 
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2018, 04:32
Ответы с готовыми решениями:

Рекурсивный компаратор
Всем доброго времени суток! Пишу компаратор &quot;рекурсивного действия&quot;. Нужно, чтобы при совпадении...

Рекурсивный перебор
Здравствуйте, есть задача:...

рекурсивный перебор
Дана строка, состоящая из M (2 ≤ M ≤ 8) попарно различных символов (буквы латинского алфавита и...

Задача на рекурсивный перебор
В выражении ((((1?2)?3)?4)?5)?6 . Нужно заменить знаки вопроса на знаки +-*/ чтобы в итоге...

1
52 / 26 / 9
Регистрация: 04.05.2013
Сообщений: 80
13.12.2018, 09:25 2
Не надо писать код в
Java
1
public static void main(Stirng[] args)
и делать все методы static из-за этого. Этот метод нужен JVM для запуска приложения, где должен создаваться объект, который будет управлять жизненным циклом программы. Правильнее будет так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.List;
import java.util.ArrayList;
 
 
public class Main {
 
    public static void main(String[] args) {
        new Main().run();
    }
 
    private List<Item> items;;
    private Backpack bag;
    private final int MAX_WEIGHT = 80;
 
    private Item[] goods = {
            new Item("", 15, 30),
            new Item("", 30, 90),
            new Item("", 50, 100)
    };
 
    public Main() {
        items = new ArrayList<>();
        bag = new Backpack(80);
    }
 
    public void run() {
        items.add(new Item("Bed", 7, 8));
        items.add(new Item("Chair", 4, 3));
        items.add(new Item("Clock", 2, 9));
 
        //  12 (4, 2)
        System.out.println(combine(items.size() - 1, bag.getMaxW()));
    }
 
    private double combine(int len, double weight){
        if (len < 0)
            return 0;
        if (items.get(len).getWeight() > weight)
            return combine(len-1, weight);
        else
            return Math.max(combine(len-1, weight), combine(len - 1, weight - items.get(len).getWeight()) + items.get(len).getValue());
    }
 
}
Также не стоит объявлять список как ArrayList, лучше использовать интерфейс List, и при присваивании задать конкретную реализацию списка.

По поводу вопроса. Всегда возвращается 0, потому что в коде нет другого условия выхода из рекурсии, кроме первого условия
Java
1
2
if (len < 0)
    return 0;
Остальные условие лишь рекурсивно уменьшают len, чтобы вернуть 0.
0
13.12.2018, 09:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2018, 09:25
Помогаю со студенческими работами здесь

рекурсивный перебор системы счисления
Задача: вводятся два числа от 1 до 6 (n и m) n - количество цифр m - порядок системы счисления...

Рекурсивный перебор директорий сервера
Всем доброго времени суток уважаемые форумчане, недавно начал изучение языка C# Вот уже несколько...

Рекурсивный перебор. Вылет за границы массива
ка, состоящая из попарно различных символов (буквы латинского алфавита и цифры). Требуется вывести...

Рекурсивный перебор элементов массива любой размерности
Так долго вожусь и все равно ничего : public static void _ForEach&lt;T&gt;(this Array a , Func&lt;T,T&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru