回答編集履歴

1

コードを一部公開

2020/02/05 03:30

投稿

rubato6809
rubato6809

スコア1382

test CHANGED
@@ -21,3 +21,93 @@
21
21
 
22
22
 
23
23
  ソートの手段もいろいろ選べます。私はqsort()を使う方法と、支払えないと判定した金額を、単方向リストの適切な位置に挿入することでソートしてしまう方法を試しました。コードは書けたので、そのプログラムの動作中の様子を表示して途中のデータの様子などを見てもらってイメージだけでも掴んでもらおうと思ったのですが、気づいたら既に質問者のアカウントが凍結されていたというお粗末(苦笑)。
24
+
25
+
26
+
27
+ ---
28
+
29
+
30
+
31
+ izmktrさん
32
+
33
+ > 組み合わせは2^7=128 なんで、全通り求めてしまえばいい
34
+
35
+
36
+
37
+ それが私の試した方法のひとつなので、私もその一部をアップします。
38
+
39
+ > 金額(1円〜500円程度)をインデックスにして、払える・払えないの配列を作る…
40
+
41
+
42
+
43
+ ```C
44
+
45
+ #include <stdio.h>
46
+
47
+ #include <stdbool.h>
48
+
49
+ int target_prices[] = {
50
+
51
+ 299, 111, 128, 71, 328, 255, 239, 260,
52
+
53
+ 151, 163, 246, 184, 253, 97, 78, 114,
54
+
55
+ };
56
+
57
+ int bills[] = { 3, 6, 11, 28, 57, 86, 119 };
58
+
59
+ bool able2pay[500]; // 最初は全て支払い不能(0〜499円に対して)
60
+
61
+ #define N_BILLS (sizeof(bills) / sizeof(bills[0]))
62
+
63
+ #define N_PRICES (sizeof(target_prices) / sizeof(target_prices[0]))
64
+
65
+ int main(void)
66
+
67
+ {
68
+
69
+ // 7枚の札、全ての組合せを調べ、支払い可能な金額は true
70
+
71
+ printf("1. build the flag table.\n");
72
+
73
+ for (int i = 1; i < (1 << N_BILLS); ++i) {
74
+
75
+ int mask = 1, sum = 0;
76
+
77
+
78
+
79
+ for (int j = 0; j < N_BILLS; ++j, mask += mask) {
80
+
81
+ if (i & mask)
82
+
83
+ sum += bills[j]; // この組み合わせに含まれる金額を足す
84
+
85
+ }
86
+
87
+ able2pay[sum] = true; // 合計金額sum円は支払い可能
88
+
89
+ }
90
+
91
+
92
+
93
+ printf("2. prices unable to pay are\n");
94
+
95
+ for (int i = 0; i < N_PRICES; ++i) {
96
+
97
+ if (! able2pay[target_prices[i]])
98
+
99
+ printf(" %d", target_prices[i]);
100
+
101
+ }
102
+
103
+ printf("\n");
104
+
105
+
106
+
107
+ printf("TODO: sort above.\n");
108
+
109
+ return 0;
110
+
111
+ }
112
+
113
+ ```