Professional Documents
Culture Documents
Пояснювальна записка Бобрише О.М.
Пояснювальна записка Бобрише О.М.
КУРСОВА РОБОТА
З дисципліни «Програмування»
На тему:
Задача про рюкзак
Виконав:
Студент I курсу групи КМ-
13, спеціальність 113
Прикладна математика
БОБРИШЕВ О.М
Керівник:
ЛЮБАШЕНКО Н.Д.
Оцінка:_________________
Кількість балів:__________
Київ - 2022
1
ЗМІСТ:
Оглавление
ВСТУП.....................................................................................................................................................2
1 ПОСТАНОВКА ЗАВДАННЯ..................................................................................................................3
2 Вибір та опис методу розв’язання....................................................................................................4
3 Алгоритм............................................................................................................................................6
4 Опис програми...................................................................................................................................7
4.1 Інструкція для кінцевого користувача......................................................................................7
4.2 Інструкція для програміста........................................................................................................9
4.2.1 Структура програми............................................................................................................9
4.2.2 Основні фунціональні модулі...........................................................................................10
4.2.3 Основні дані.......................................................................................................................11
5 Результати виконання тестів...........................................................................................................13
ВИСНОВКИ...........................................................................................................................................15
Література...........................................................................................................................................16
Додаток А. Текст програми на мові С................................................................................................17
2
ВСТУП
Проблематика
1 ПОСТАНОВКА ЗАВДАННЯ
{
V [ i−1 , j ] = max {V [ i−1 , j ] , v i +V [ i−1 , j ] } , якщо j−w i> 0 З початковими умовами
V [ i−1 , j ] , якщо j−w i <0
V [ 0 , j ] =0 , V [ i , 0 ] =0 , при j ≥ 0 ,i ≥ 0.
Для того, щоб дізнатись набор предметів, який має входити у рюкзак,
необхідно порівняти значення V[n, w] з V[n-1,w]. Якщо вони рівні, то n
елемент не входить у рюкзак, якщо ні, то входить. Після цього потрібно
перевіряти V[n-1, w−wn] з V[n-2, w−wn] і так далі.
Цей алгоритм є псевдо-поліноміальним з часовою ефективністю θ ( nw )
. Через часову ефективність методом розв’язку задачі було обрано
алгоритм динамічного програмування.
6
3 Алгоритм
for i := 0 to n
for j := 0 to W
if i = 0 to j = 0
v[i, j] := 0
else if j < w i
v[i, j] := v[i-1, j]
else
end if
end for
end for
for i := n to 0
if v[i-1, w n] = v[i-1, w n]
continuew
else
end if
end for
7
4 Опис програми
Переміщення курсору в
консолі у точку з
gotoxy x – координата х, координатами
y – координата y x, y
збереження параметрів
введених предметів
items Тип - струтура
Об’єкти
Значення переміщення
рамки від лівого краю
sh Тип - змінна int консолі
Значення того, чи є
останній зчитаний елемент
result Тип - змінна int симоволом пробілу або
переведення рядка
Дорівнює поверненому
значенню функції
isEmpty Тип – змінна int check_stdin
Збереження значень
структур
items inf Тип – масив struct
Кількість предметів
max_weight_check
Створення динамічного
масиву в залежності від
result Тип – вказівник на значення len
int
Матриця коштовностей
екземплярів задачі
V Тип – масив int
Лічильник кількості
предметів, які входять у
k Тип – змінна int склад фінальної
оптимальної підмножини
13
1. Максимальна вага – 10
2. Максимальна вага – 8
ВИСНОВКИ
Література
#include <stdio.h>
#include <conio.h>
#include <windows.h>
SetConsoleCP(866);
SetConsoleOutputCP(866);
int sh = 23;
gotoxy(sh, 1);
18
printf("%c", a);
for (int i = 0; i < 70; i++){
printf("%c", b);
}
printf("%c\n", c);
gotoxy(sh, 17);
printf("%c", e);
for (int i = 0; i < 70; i++){
printf("%c", b);
}
printf("%c\n", f);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
gotoxy(sh+28,3);
printf("Курсова робота");
gotoxy(2+sh, 5);
printf("Предметна область: струтури даних і алгоритми");
gotoxy(2+sh, 7);
printf("Тема: задача про рюкзак");
gotoxy(2+sh, 10);
printf("Виконав студент групи КМ-13");
gotoxy(47+sh, 10);
printf("Бобришев О.М.");
gotoxy(33+sh, 16);
printf("2022");
gotoxy(1+sh, 18);
printf("Натисніть будь-яку кнопку для переходу в меню ");
gotoxy(1+sh, 19);
char choice = getch();
if (choice != '\0'){
system("cls");
}
}
int result = 1;
char ch;
return result;
}
void program(){
struct items inf[1000];
int i = 0;
int len = 0;
char a;
int isNormal_weight;
int isNormal_value;
int max_weight_check;
int m_w;
printf("\nВведіть максимальну вагу, яку може витримати рюкзак: ");
while(1){
fflush(stdin); // очищення потоку введення
max_weight_check = scanf("%d", &m_w);
if(check_value(max_weight_check, 1) == 0){
printf("Для задання максимальною ваги, ви маєте вводити лише цілі
числа\n");
20
do{
printf("Введіть інформацію про предмет %d: ", i + 1);
while(1){
}
if(inf[i].value <= 0){ // перевірка введеного числа на те, чи є
воно від'ємним
printf("\nДля введення коштовності ви маєте вводити числа, не
менші за нуль\n");
printf("\nПеревведіть інформацію прол предмет %d: ", i + 1);
continue;
}
break;
}
i++;
len++;
} while (a = getch() != '-' && i <= 100);
int *result;
result = (int*) malloc(len * sizeof(int)); // створення динамічного
масиву, кількість елементів якого залежить від кількості введених предметів
}else{
v[i][j] = max(v[i-1][j], inf[i-1].value + v[i-1][j-inf[i-
1].weight]);
}
}
}
int k = 0;
int main(void){
intro();
while(1){
int number;
printf("\nОберіть один із варіантів:\n");
printf("1 - задача про рюкзак\n");
printf("2 - повернутися до початкового екрану\n");
printf("Будь-яка інша кнопка - вихід із програми\n");
printf("Уведіть номер обраного пункту: ");
scanf("%d", &number);
if (number == 1){
program();
int clear;
printf("\n\nОберіть один із варіантів:\n");
printf("1 - очистити коносоль вводу\n");
printf("будь-який символ - продовжити\n");
printf("Уведіть номер обраного пункту: ");
scanf("%d", &clear);
if (clear == 1){
system("cls");
continue;
}
}else if(number == 2){
system("cls");
intro();
}else{
printf("Програму завершено!");
break;
23
}
}
}