aboutsummaryrefslogtreecommitdiffstats
path: root/src
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 /src
parent9196ea8f3d150b4b538caeb7e5477cf095b359b9 (diff)
downloadlibuknapsack-d8ea8dc5fa670477cb6a3c64a9fe7dbbb0c44898.tar.gz
libuknapsack-d8ea8dc5fa670477cb6a3c64a9fe7dbbb0c44898.zip
Add dfs
Diffstat (limited to 'src')
-rw-r--r--src/dfs.c35
-rw-r--r--src/main/dfs.c31
-rw-r--r--src/main/nem_ull.c2
3 files changed, 67 insertions, 1 deletions
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);