結果
問題 |
No.2869 yuusaan's Knapsacks
|
ユーザー |
|
提出日時 | 2024-10-19 02:20:27 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,149 ms / 4,500 ms |
コード長 | 1,594 bytes |
コンパイル時間 | 2,166 ms |
コンパイル使用メモリ | 200,184 KB |
最終ジャッジ日時 | 2025-02-24 21:25:12 |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#include<bits/stdc++.h> using namespace std; using ll=long long; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); ll N,M; cin>>N>>M; vector<ll> E(N); for(int i=0;i<N;i++)cin>>E[i]; reverse(E.begin(),E.end()); vector<ll> V(M),W(M); for(int i=0;i<M;i++)cin>>V[i]>>W[i]; vector<ll> SV(1<<M,0),SW(1<<M,0); for(int bit=0;bit<(1<<M);bit++){ for(int i=0;i<M;i++){ if(bit&(1<<i)){ SV[bit]+=V[i]; SW[bit]+=W[i]; } } } vector<vector<ll>> DP(N+1,vector<ll>(1<<M,-1e18)); DP[0][0]=0; for(int i=0;i<N;i++){ for(int pit=0;pit<(1<<M);pit++){ int bit=(1<<M)-1-pit; for (ll b = bit; b >= 0; b = (b - 1) & bit) { if(SW[b]<=E[i]){ DP[i+1][pit+b]=max(DP[i+1][pit+b],DP[i][pit]+SV[b]); } if (b == 0)break; } } } ll an=-1e18,mbit=0;; for(int bit=0;bit<(1<<M);bit++){ if(an<DP[N][bit])mbit=bit; an=max(an,DP[N][bit]); } cout<<an<<endl; for(int i=N-1;i>=0;i--){ for (ll b = mbit; b >= 0; b = (b - 1) & mbit) { if(DP[i][b]+SV[mbit-b]==DP[i+1][mbit]&&SW[mbit-b]<=E[i]){ ll pit=mbit-b; cout<<__builtin_popcount(pit); for(int j=0;j<M;j++){ if(pit&(1<<j))cout<<" "<<j+1; } cout<<endl; mbit=b; break; } if (b == 0)break; } } }