回答編集履歴

1

追記

2022/04/27 14:22

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -1,2 +1,40 @@
1
1
  val の値と start の値を全く使っていませんね。
2
2
  wt の値と end の値だけで正しい結果が得られるとは思えません。
3
+
4
+ **追記**
5
+ 書いてみました。
6
+ ```c
7
+ #include <stdio.h> // scanf, printf
8
+ #include <string.h> // memset, memchr
9
+
10
+ int max(int a, int b) { return a > b ? a : b; }
11
+
12
+ int knapsack(int w, int a[], int b[], int n, char t[])
13
+ {
14
+ if (--n < 0) return w;
15
+ int len = b[n] - a[n];
16
+ if (memchr(t + a[n], 1, len)) return knapsack(w, a, b, n, t);
17
+ memset(t + a[n], 1, len);
18
+ int k = knapsack(w + len, a, b, n, t);
19
+ memset(t + a[n], 0, len);
20
+ return max(k, knapsack(w, a, b, n, t));
21
+ }
22
+
23
+ int main(void)
24
+ {
25
+ int n, m = 0, start, end;
26
+ scanf("%d", &n);
27
+ int a[n], b[n];
28
+ for (int i = 0; i < n; i++) {
29
+ scanf("%d%d", &a[i], &b[i]);
30
+ if (b[i] > m) m = b[i];
31
+ }
32
+ scanf("%d%d", &start, &end);
33
+ if (end > m) m = end;
34
+ char t[m];
35
+ memset(t, 1, m);
36
+ memset(t + start, 0, end - start);
37
+ printf("%d\n", knapsack(0, a, b, n, t));
38
+ }
39
+ ```
40
+