結果
問題 | No.527 ナップサック容量問題 |
ユーザー |
![]() |
提出日時 | 2019-09-05 19:20:03 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 7 ms / 2,000 ms |
コード長 | 1,156 bytes |
コンパイル時間 | 229 ms |
コンパイル使用メモリ | 30,464 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-12 04:15:33 |
合計ジャッジ時間 | 1,749 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 37 |
コンパイルメッセージ
main.c: In function 'in': main.c:9:14: warning: implicit declaration of function 'getchar_unlocked' [-Wimplicit-function-declaration] 9 | #define gc() getchar_unlocked() | ^~~~~~~~~~~~~~~~ main.c:15:24: note: in expansion of macro 'gc' 15 | int n = 0, c = gc(); | ^~
ソースコード
// yukicoder: 527 ナップサック容量問題// 2019.9.5 bal4u#include <stdio.h>#include <string.h>//// 高速入力#if 1#define gc() getchar_unlocked()#else#define gc() getchar()#endifint in() { // 非負整数の入力int n = 0, c = gc();do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0');return n;}int N;int dp[100005];int v[103], w[103], V;// a[i]>=key という条件を満たす最小のiint lower_bound(int *a, int sz, int x) {int m, l = 0, r = sz;while (l+1 < r) {m = (l+r)/2;if (a[m] < x) l = m; else r = m;}return a[l] < x? r: l;}inline static void chmax(int *r, int a, int b) {if (a < b) a = b;if (*r < a) *r = a;}int main(){int i, j, b;N = in(); for (i = 1; i <= N; i++) v[i] = in(), w[i] = in();V = in();memset(dp, -1, sizeof(dp));dp[0] = 0, b = 0;for (i = 1; i <= N; i++) {b += w[i];for (j = b; j >= w[i]; j--) if (dp[j-w[i]] >= 0) {chmax(&dp[j], dp[j-w[i]] + v[i], dp[j]);}}for (i = 0; dp[i] < V; i++);if (i == 0) i = 1;printf("%d\n", i);if (i == b) puts("inf");else {while (dp[i] <= V) i++;printf("%d\n", i-1);}return 0;}