結果
問題 |
No.286 Modulo Discount Store
|
ユーザー |
![]() |
提出日時 | 2019-01-18 13:29:15 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 5 ms / 2,000 ms |
コード長 | 950 bytes |
コンパイル時間 | 783 ms |
コンパイル使用メモリ | 102,212 KB |
最終ジャッジ日時 | 2025-01-06 20:29:47 |
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 40 |
ソースコード
#include<iostream> #include<vector> #include<algorithm> #include<functional> #include<set> #include<map> #include<iomanip> int main() { int N; std::cin >> N; std::vector<int> vec(N); for (auto& v : vec) { std::cin >> v; } std::vector<int> dp(1 << N, 100000000); dp[0] = 0; std::vector<int> discount(1 << N); std::vector<std::vector<int>> bitflag(N + 1); for (int i = 0; i < (1 << N); ++i) { int c = 0; for (int k = 0; k < N; ++k) { if (i&(1 << k)) { discount[i] = (discount[i] + vec[k]) % 1000; ++c; } } bitflag[c].emplace_back(i); } for (int i = 0; i < N; ++i) { for (auto f : bitflag[i]) { for (int k = 0; k < N; ++k) { if (f&(1 << k)) { continue; } else { dp[f | (1 << k)] = std::min(dp[f | (1 << k)], dp[f] + std::max(0, vec[k] - discount[f])); } } } } std::cout << dp[(1 << N) - 1] << std::endl; }