飽きた
これは、報告兼けじめです。
重大な報告だと思った?
残念!!!重大じゃないです。
この前取り組んでた
ABC 032 D ナップサック問題
これですけど、飽きたので、飛ばします。
以上、報告です。
バグ取りで、無理やなと感じたので、供養。南無。
#include <cstdio> #include <map> #include <cstring> using namespace std; #define N_MAX 250 #define W_MAX 1500 #define V_MAX 1000 #define INF 10000000000LL #define ull unsigned long long long long N, W; long long v[N_MAX], w[N_MAX]; map<long long, map<long long, long long> > mp; long long dp[N_MAX][W_MAX]; unsigned long long dp2[N_MAX][N_MAX*V_MAX]; long long rec(long long pos, long long rest) { if (pos == N) { return 0; } const_iterator itr = mp.find(pos); if (itr != mp.end()) { const_iterator itr2 = itr->second.find(rest); if (itr2 != itr->second.end()) { return itr2->second; } } long long ans = rec(pos+1, rest); if (rest-w[pos] >= 0) { long long tmp = rec(pos+1, rest-w[pos])+v[pos]; ans = ans > tmp ? ans : tmp; } mp[pos][rest] = ans; return ans; } int main() { scanf("%lld %lld", &N, &W); for (int i = 0; i < N; i++) { scanf("%lld %lld", &v[i], &w[i]); } if (1 <= w[0] && w[0] <= 1000) { for (int i = N-1; i > -1; i--) { for (int j = 0; j <=W; j++) { if (j-w[i] >= 0) { long long tmp = dp[i+1][j-w[i]]+v[i]; dp[i][j] = (dp[i+1][j] > tmp) ? dp[i+1][j] : tmp; } else { dp[i][j] = dp[i+1][j]; } } } printf("%lld\n", dp[0][W]); } else if (0 <= v[0] && v[0] <= 1000) { memset(dp2, -1, sizeof(dp2)); dp2[N][0] = 0; for (int i = N-1; i > -1; i--) { for (unsigned long long j = 0; j <= V_MAX * N_MAX; j++) { if (j-v[i] >= 0) { unsigned long long tmp = dp2[i+1][j-v[i]]+w[i]; dp2[i][j] = (dp2[i+1][j] < tmp)?dp2[i+1][j]:tmp; } else { dp2[i][j] = dp2[i+1][j]; } } } unsigned long long res = 0; for (int i = 0; i <= V_MAX * N_MAX; i++) { if (dp2[0][i] <= W) { res = i; } } printf("%lld\n", res); } else { printf("%lld\n", rec(0, W)); } return 0; }
サクサクいけそうなのをやっていこう!!!