diff options
Diffstat (limited to 'Practical2/checkout.c')
-rw-r--r-- | Practical2/checkout.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/Practical2/checkout.c b/Practical2/checkout.c new file mode 100644 index 0000000..82eda3a --- /dev/null +++ b/Practical2/checkout.c @@ -0,0 +1,73 @@ +#include <stdio.h> +#include <stdint.h> + +uint32_t round_ct(uint32_t cents) { + switch (cents % 5) { + case 0: return cents; + case 1: return cents - 1; + case 2: return cents - 2; + case 3: return cents + 2; + case 4: return cents + 1; + } +} + +int32_t maximum_profit(uint16_t products[], uint16_t n_products, uint8_t dividers) { + uint32_t sums[n_products+1][n_products+1]; + uint16_t i, j; + for (i = 0; i <= n_products; i++) { + for (j = 0; j <= n_products; j++) { + if (j <= i) { + sums[i][j] = 0; + } else if (j == 1) { + sums[i][j] = products[0]; + } else { + sums[i][j] = sums[i][j-1] + products[j-1]; + } + } + } + + int32_t profit[n_products+1][dividers+1]; + uint16_t p, d; + for (p = 0; p <= n_products; p++) { + for (d = 0; d <= dividers; d++) { + if (p == 0) { + profit[p][d] = 0; + } else if (d == 0) { + profit[p][d] = sums[0][p] - round_ct(sums[0][p]); + } else { + int32_t max = profit[p][d-1]; + uint16_t i; + for (i = 0; i < p; i++) { + int32_t try = profit[i][d-1] + sums[i][p] - round_ct(sums[i][p]); + if (try > max) + max = try; + } + profit[p][d] = max; + } + } + } + + return profit[n_products][dividers]; +} + +int main(void) { + int n_products; + int dividers; + uint32_t sum = 0; + + scanf("%d %d", &n_products, ÷rs); + + uint16_t products[n_products]; + uint16_t i; + for (i = 0; i < n_products; i++) { + scanf("%d", &(products[i])); + sum += products[i]; + if (products[i] % 5 == 0) { + n_products--; + i--; + } + } + + printf("%d\n", sum - maximum_profit(products, n_products, dividers)); +} + |