Submission #784028

#TimeUsernameProblemLanguageResultExecution timeMemory
784028rainboyKnapsack (NOI18_knapsack)C11
73 / 100
1067 ms1236 KiB
#include <stdio.h>
#include <string.h>

#define M	2000

int max(int a, int b) { return a > b ? a : b; }

int main() {
	static int dp[M + 1], dq[M + 1], qu[M + 1];
	int n, m, r, s, ans, head, cnt;

	scanf("%d%d", &m, &n);
	memset(dp, -1, (m + 1) * sizeof *dp), dp[0] = 0;
	while (n--) {
		int v, w, k;

		scanf("%d%d%d", &v, &w, &k);
		for (r = 0; r < w; r++) {
			head = cnt = 0;
			for (s = r; s <= m; s += w) {
				if (dp[s] != -1) {
					dq[s] = dp[s] - s / w * v;
					while (cnt && dq[qu[head + cnt - 1]] <= dq[s])
						cnt--;
					qu[head + cnt++] = s;
				}
				dp[s] = cnt == 0 ? -1 : dq[qu[head]] + s / w * v;
				if (cnt && (s - qu[head]) / w == k)
					head++, cnt--;
			}
		}
	}
	ans = 0;
	for (s = 0; s <= m; s++)
		ans = max(ans, dp[s]);
	printf("%d\n", ans);
	return 0;
}

Compilation message (stderr)

knapsack.c: In function 'main':
knapsack.c:12:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |  scanf("%d%d", &m, &n);
      |  ^~~~~~~~~~~~~~~~~~~~~
knapsack.c:17:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |   scanf("%d%d%d", &v, &w, &k);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...