Comment detail

コインを減らす払い方 (Nested Flatten)
http://ja.doukaku.org/comment/63/と同様のアルゴリズムでやってみました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>

typedef struct {
    int value; /* お金の価値 */
    int has;   /* 何枚持っているか */
} coin_data;

void pay(int expense, coin_data *pay_coin, coin_data *coin_case);

int main()
{
    int i;
    /* 始めに持っているお金 */
    coin_data coin_case[6] = {
        {  1, 2}, {  5, 300}, { 10, 4},
        { 50, 0}, {100, 3}, {500, 0},
    };
    /* 払うお金 */
    coin_data pay_coin[6] = {
        {  1, 0}, {  5, 0}, { 10, 0},
        { 50, 0}, {100, 0}, {500, 0},
    };

    for (i = 0; i < 6; i++) {
        printf("%d円玉 : %d枚\n", coin_case[i].value, coin_case[i].has);
    }
    pay(147, pay_coin, coin_case);
    for (i = 0; i < 6; i++) {
        printf("%d円玉 : %d枚\n", pay_coin[i].value, pay_coin[i].has);
    }

    return 0;
}

void pay(int expense, coin_data *pay_coin, coin_data *coin_case)
{
    int current_total;
    int i, j;

    current_total = 0;
    while (coin_case[5].has > 0) {
        current_total += coin_case[5].value;
        coin_case[5].has--;
        pay_coin[5].has++;
    }
    for (i = 4; i >= 0; i--) {
        while (coin_case[i].has > 0) {
            current_total += coin_case[i].value;
            coin_case[i].has--;
            pay_coin[i].has++;
        }
        while ((current_total - coin_case[i+1].value) >= expense
            && pay_coin[i+1].has > 0) {
            current_total -= coin_case[i+1].value;
            coin_case[i+1].has++;
            pay_coin[i+1].has--;
        }
    }
}

Index

Feed

Other

Link

Pathtraq

loading...