aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Jesus <adbjesus@gmail.com>2016-09-15 00:32:24 +0100
committerAlexandre Jesus <adbjesus@gmail.com>2016-09-15 00:32:24 +0100
commitd8ea8dc5fa670477cb6a3c64a9fe7dbbb0c44898 (patch)
treed582af7bbe4edd2b30d7337c2d532c302eaa62b7
parent9196ea8f3d150b4b538caeb7e5477cf095b359b9 (diff)
downloadlibuknapsack-d8ea8dc5fa670477cb6a3c64a9fe7dbbb0c44898.tar.gz
libuknapsack-d8ea8dc5fa670477cb6a3c64a9fe7dbbb0c44898.zip
Add dfs
-rw-r--r--CMakeLists.txt13
-rw-r--r--include/dfs.h8
-rw-r--r--src/dfs.c35
-rw-r--r--src/main/dfs.c31
-rw-r--r--src/main/nem_ull.c2
5 files changed, 85 insertions, 4 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2c22493..da3c722 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -38,6 +38,7 @@ set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/_install)
set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
set(INCLUDE_FILES
${INCLUDE_DIR}/nem_ull.h
+ ${INCLUDE_DIR}/dfs.h
${INCLUDE_DIR}/structs.h
${INCLUDE_DIR}/common.h
)
@@ -45,6 +46,7 @@ set(INCLUDE_FILES
set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(SRC_FILES
${SRC_DIR}/nem_ull.c
+ ${SRC_DIR}/dfs.c
${SRC_DIR}/common.c
)
@@ -52,10 +54,15 @@ set(MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/main)
include_directories (${INCLUDE_DIR})
-add_library(nem_ull_lib STATIC ${SRC_FILES})
+add_library(uknapsack STATIC ${SRC_FILES})
+
add_executable(nem_ull ${MAIN_SRC_DIR}/nem_ull.c)
-target_link_libraries(nem_ull nem_ull_lib)
+add_executable(dfs ${MAIN_SRC_DIR}/dfs.c)
+
+target_link_libraries(nem_ull uknapsack)
+target_link_libraries(dfs uknapsack)
install(TARGETS nem_ull DESTINATION bin)
-install(TARGETS nem_ull_lib DESTINATION lib)
+install(TARGETS dfs DESTINATION bin)
+install(TARGETS uknapsack DESTINATION lib)
install(FILES ${INCLUDE_FILES} DESTINATION include)
diff --git a/include/dfs.h b/include/dfs.h
new file mode 100644
index 0000000..340f5c8
--- /dev/null
+++ b/include/dfs.h
@@ -0,0 +1,8 @@
+#ifndef _DFS_H
+#define _DFS_H
+
+#include "structs.h"
+
+struct front_item * dfs(struct data *);
+
+#endif
diff --git a/src/dfs.c b/src/dfs.c
new file mode 100644
index 0000000..3f34001
--- /dev/null
+++ b/src/dfs.c
@@ -0,0 +1,35 @@
+#include <stdlib.h>
+#include "dfs.h"
+#include "structs.h"
+#include "common.h"
+
+struct front_item * rec(struct data * d, int i, struct item * it) {
+ if(i == d->N) {
+ return new_front_item(it->p, it->w, NULL, NULL);
+ }
+
+ // Go left (select item)
+ it->p += d->items[i].p;
+ it->w += d->items[i].w;
+ struct front_item * f1 = rec(d, i+1, it);
+ it->p -= d->items[i].p;
+ it->w -= d->items[i].w;
+ // Go right (do not select item)
+ struct front_item * f2 = rec(d, i+1, it);
+
+ // Merge
+ struct front_item * f1_end = f1;
+ for(;f1_end->next!=NULL; f1_end = f1_end->next);
+ f1_end->next = f2;
+ f2->prev = f1_end;
+
+ return f1;
+}
+
+struct front_item * dfs(struct data * d) {
+ struct item * it = (struct item *)malloc(sizeof(struct item));
+ it->p = 0;
+ it->w = 0;
+
+ return rec(d, 0, it);
+}
diff --git a/src/main/dfs.c b/src/main/dfs.c
new file mode 100644
index 0000000..36faa25
--- /dev/null
+++ b/src/main/dfs.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <time.h>
+#include "common.h"
+#include "structs.h"
+#include "dfs.h"
+
+int main(int argc, char * argv[]){
+ struct data * d;
+ struct front_item * b;
+
+ if(argc!=2){
+ printf("Wrong number of arguments!\n");
+ printf("Example usage: %s data_file\n",argv[0]);
+ return 0;
+ }
+
+ d = input(argv[1]);
+
+ clock_t t = clock();
+ b = dfs(d);
+
+ t = clock() - t;
+ printf("%f,%d\n",((float)t)/CLOCKS_PER_SEC,len_front(b));
+
+ print_front(b);
+
+ free_front(b);
+ free_data(d);
+
+ return 0;
+}
diff --git a/src/main/nem_ull.c b/src/main/nem_ull.c
index 1bf183a..b267422 100644
--- a/src/main/nem_ull.c
+++ b/src/main/nem_ull.c
@@ -22,7 +22,7 @@ int main(int argc, char * argv[]){
t = clock() - t;
printf("%f,%d\n",((float)t)/CLOCKS_PER_SEC,len_front(b));
- //print_front(b);
+ print_front(b);
free_front(b);
free_data(d);