diff options
author | Alexandre Jesus <adbjesus@gmail.com> | 2016-09-15 00:32:24 +0100 |
---|---|---|
committer | Alexandre Jesus <adbjesus@gmail.com> | 2016-09-15 00:32:24 +0100 |
commit | d8ea8dc5fa670477cb6a3c64a9fe7dbbb0c44898 (patch) | |
tree | d582af7bbe4edd2b30d7337c2d532c302eaa62b7 /src | |
parent | 9196ea8f3d150b4b538caeb7e5477cf095b359b9 (diff) | |
download | libuknapsack-d8ea8dc5fa670477cb6a3c64a9fe7dbbb0c44898.tar.gz libuknapsack-d8ea8dc5fa670477cb6a3c64a9fe7dbbb0c44898.zip |
Add dfs
Diffstat (limited to 'src')
-rw-r--r-- | src/dfs.c | 35 | ||||
-rw-r--r-- | src/main/dfs.c | 31 | ||||
-rw-r--r-- | src/main/nem_ull.c | 2 |
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); |