回答編集履歴

1

加筆修正

2019/07/06 22:54

投稿

majiponi
majiponi

スコア1722

test CHANGED
@@ -10,4 +10,124 @@
10
10
 
11
11
 
12
12
 
13
- キーワードは、ビット操作、インクリメントです。
13
+ ググるためのキーワードは、ビット操作、インクリメントです。
14
+
15
+
16
+
17
+
18
+
19
+ 追記:具体化するとどうなる? とご指摘を頂いたので、あまり本人のためにならないかもですが、コードを書きます。
20
+
21
+ ```C
22
+
23
+ #include <stdlib.h>
24
+
25
+
26
+
27
+ int main(void)
28
+
29
+ {
30
+
31
+ int n;// up to 32
32
+
33
+ int maxweight;
34
+
35
+ int weight[32];
36
+
37
+ int value[32];
38
+
39
+ int maxvalue = 0;
40
+
41
+ int i, e, j, w, v;
42
+
43
+
44
+
45
+ printf("品物の数");
46
+
47
+ scanf("%d", &n);
48
+
49
+ if(n < 1 || 32 < n){
50
+
51
+ printf("ERROR!\n");
52
+
53
+ exit(0);
54
+
55
+ }
56
+
57
+ printf("重さと価値\n");
58
+
59
+ for(i = 0; i < n; i++){
60
+
61
+ scanf("%d , %d", &weight[i], &value[i]);
62
+
63
+ if( weight[i] < 1 || 100 < weight[i] || value[i] < 1 || 100 < value[i]){
64
+
65
+ printf("ERROR!\n");
66
+
67
+ exit(0);
68
+
69
+ }
70
+
71
+ }
72
+
73
+ printf("求める総和");
74
+
75
+ scanf("%d", &maxweight);
76
+
77
+ if(maxweight < 1 || 10000 < maxweight){
78
+
79
+ printf("ERROR!\n");
80
+
81
+ exit(0);
82
+
83
+ }
84
+
85
+
86
+
87
+ e = 1 << n;
88
+
89
+ for(i = 1; i != e;){
90
+
91
+ w = 0;
92
+
93
+ v = 0;
94
+
95
+ for(j = 0; j < n; j++){
96
+
97
+ if(i & (1 << (n - 1 - j))){
98
+
99
+ w += weight[j];
100
+
101
+ v += value[j];
102
+
103
+ }
104
+
105
+ }
106
+
107
+ if(w > maxweight){
108
+
109
+ i += (i & -i);
110
+
111
+ }
112
+
113
+ else{
114
+
115
+ if(v > maxvalue){
116
+
117
+ maxvalue = v;
118
+
119
+ }
120
+
121
+ i++;
122
+
123
+ }
124
+
125
+ }
126
+
127
+
128
+
129
+ return 0;
130
+
131
+ }
132
+
133
+ ```