diff --git a/pull_reqeust_test/haebong/packing_knapsack/generator_test_script.py b/pull_reqeust_test/haebong/packing_knapsack/generator_test_script.py new file mode 100644 index 00000000..7a792299 --- /dev/null +++ b/pull_reqeust_test/haebong/packing_knapsack/generator_test_script.py @@ -0,0 +1,22 @@ +#!/bin/python +import random + +test_script = open("test.sh","w") + +test_script.write("#!/bin/bash\n") +test_script.write("echo -e \"") + +nr = random.randrange(1,1000) +w = random.randrange(1,10000) + +test_script.write(str(nr)+" "+str(w)+"\\n\\\n") + + +for i in range(1,nr-1): + j_p = random.randrange(1,w) + j_w = random.randrange(1,w) + test_script.write(str(j_p)+" "+str(j_w)+"\\n\\\n") + +j_p = random.randrange(1,w) +j_w = random.randrange(1,w) +test_script.write(str(j_p)+" "+str(j_w)+"\\n\" | ./a.out") diff --git a/pull_reqeust_test/haebong/packing_knapsack/knapsack_problem.pdf b/pull_reqeust_test/haebong/packing_knapsack/knapsack_problem.pdf new file mode 100644 index 00000000..0949b30f Binary files /dev/null and b/pull_reqeust_test/haebong/packing_knapsack/knapsack_problem.pdf differ diff --git a/pull_reqeust_test/haebong/packing_knapsack/packing_knapsack.c b/pull_reqeust_test/haebong/packing_knapsack/packing_knapsack.c new file mode 100644 index 00000000..debdfbb0 --- /dev/null +++ b/pull_reqeust_test/haebong/packing_knapsack/packing_knapsack.c @@ -0,0 +1,115 @@ +/* + * Packing knapsack question + * + * Copyright (C) 2016, Taeung Song + * + */ +#include +#include +#include +#include + +#define MAX_INPUT 16 + +struct knapsack { + unsigned int maxprice; +} *knapsack_list; + +struct jewelry { + unsigned int wgt; + unsigned int price; +}; + +unsigned int limited_wgt; + +unsigned int get_cond_maxprice(int wgt, struct jewelry *jewelry) +{ + /* Get maximum price based on a specific weight + * following a specific jewelry. + */ + int i; + int rest_wgt = wgt - jewelry->wgt; + int price = jewelry->price + knapsack_list[rest_wgt].maxprice; + + return knapsack_list[wgt].maxprice < price ? + price : knapsack_list[wgt].maxprice; +} + +void pack_knapsack(struct jewelry *jewelry) +{ + /* Case by case pack knapsack following maximum + * price per limited weight. + */ + int wgt; + + if (limited_wgt < jewelry->wgt) + return; + + for (wgt = 0; wgt <= limited_wgt; wgt++) { + if (jewelry->wgt <= wgt) { + unsigned int maxprice = get_cond_maxprice(wgt, jewelry); + + if (knapsack_list[wgt].maxprice < maxprice) + knapsack_list[wgt].maxprice = maxprice; + } + } +} + +bool get_values_from(char *input, unsigned int *val1, unsigned int *val2) +{ + char *arg; + char *ptr = strdup(input); + + if (!ptr) { + printf("%s: strdup failed\n", __func__); + exit(1); + } + + arg = strsep(&ptr, " "); + *val1 = atoi(arg); + if (ptr == NULL) { + printf("Error: Need a whitespace\n"); + return false; + } + + *val2 = atoi(ptr); + + return true; +} + +int main(int argc, const char **argv) +{ + int i; + struct jewelry *jewels; + char input[MAX_INPUT]; + unsigned int nr_jewels; + + fgets(input, sizeof(input), stdin); + if (get_values_from(input, &nr_jewels, &limited_wgt) == false) + return -1; + + jewels = malloc(sizeof(struct jewelry) * nr_jewels); + for (i = 0; i < nr_jewels; i++) { + bool ret; + + fgets(input, sizeof(input), stdin); + ret = get_values_from(input, &jewels[i].wgt, + &jewels[i].price); + if (ret == false) + return -1; + } + + /* from 0 to last limited weight */ + knapsack_list = malloc(sizeof(struct knapsack) * (limited_wgt + 1)); + + for (i = 0; i <= limited_wgt; i++) + knapsack_list[i].maxprice = 0; + + for (i = 0; i < nr_jewels; i++) + pack_knapsack(&jewels[i]); + + printf("%d\n", knapsack_list[limited_wgt].maxprice); + free(jewels); + free(knapsack_list); + return 0; +} diff --git a/pull_reqeust_test/haebong/packing_knapsack/test.sh b/pull_reqeust_test/haebong/packing_knapsack/test.sh new file mode 100644 index 00000000..e54bd882 --- /dev/null +++ b/pull_reqeust_test/haebong/packing_knapsack/test.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +echo -e "4 14\n\ +2 40\n\ +5 110\n\ +10 200\n\ +3 50\n" | ./$1