結果
| 問題 |
No.2869 yuusaan's Knapsacks
|
| コンテスト | |
| ユーザー |
nonon
|
| 提出日時 | 2024-08-30 23:25:01 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,432 bytes |
| コンパイル時間 | 1,977 ms |
| コンパイル使用メモリ | 198,944 KB |
| 最終ジャッジ日時 | 2025-02-24 03:24:59 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 8 WA * 19 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
int N,M,e[16],v[16],w[16];
bool can[16][1<<16];
long V[1<<16],W[1<<16],dp[17][1<<16];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>N>>M;
for(int i=0;i<N;i++)cin>>e[i];
for(int i=0;i<M;i++)cin>>v[i]>>w[i];
for(int bit=0;bit<1<<M;bit++)
{
V[bit]=0,W[bit]=0;
for(int i=0;i<M;i++)if(bit>>i&1)
{
V[bit]+=v[i];
W[bit]+=w[i];
}
for(int i=0;i<N;i++)can[i][bit]=(W[bit]<=e[i]);
}
int mask=(1<<M)-1;
for(int i=0;i<N;i++)for(int bit=0;bit<1<<M;bit++)
{
int sub=mask^bit;
for(int nbit=sub;;nbit=(nbit-1)&sub)
{
if(can[i][nbit])dp[i+1][bit^nbit]=max(dp[i+1][bit^nbit],dp[i][bit]+V[nbit]);
if(nbit==0)break;
}
}
long ans=0;
for(int bit=0;bit<1<<M;bit++)ans=max(ans,dp[N][bit]);
cout<<ans<<endl;
for(int bit=0;bit<1<<M;bit++)if(ans==dp[N][bit])mask=bit;
vector<vector<int>>C(N);
for(int i=N;i--;)
{
for(int bit=0;bit<1<<M;bit++)
{
if(dp[i+1][mask]==dp[i][mask^bit]+V[bit])
{
mask^=bit;
for(int j=0;j<M;j++)if(bit>>j&1)C[i].push_back(j);
break;
}
}
}
for(int i=0;i<N;i++)
{
cout<<C[i].size();
for(int p:C[i])cout<<' '<<p+1;
cout<<endl;
}
}
nonon