#include using namespace std; int Power(int a, int n){ int ret = 1; int p = a; while (n){ if (n & 1) ret = ret * p; p = p * p; n >>= 1; } return ret; } pair pairmax(pair a,pair b,int pre){ if(b > a)swap(a,b); if(a.first > b.first){ } } int main(){ int inf = 2e9;//無限大として扱う値 //入力を受け取る int N,M; cin >> N >> M; vector e(N),v(M),w(M); for(int i = 0;i < N;i++)cin >> e[i]; for(int i = 0;i < M;i++)cin >> v[i] >> w[i]; //ステップ1:各荷物の選び方について合計価値及び合計の重さの事前計算 vector V((1< 1e9)over = 1;//重さが10^9を超えたら特殊処理(long long型ならなくても可) } if(over){//重さが10^9を超えたときの特殊処理 V[i] = vsum; W[i] = inf; } else{ V[i] = vsum; W[i] = wsum; } } //ステップ2 Bit-DP int vmax = 0; vector> DP(N+1,vector((1<> RT(N+1,vector((1< ans(1 + N,0); bool loopbreak = 0; for(int i = 1;i <= N;i++){ for(int j = 1;j < (1 << M);j++){ if(DP[i][j] == vmax){ while(i > 0){ //cout << j << endl; ans[i] = RT[i][j]; j -= RT[i][j]; i--; } loopbreak = 1;//DP[i][j] == vmaxを一度見つけ、操作を行ったらループから抜ける break; } } if(loopbreak)break; } for(int i = 1;i <= N;i++){ int count = 0; vector out = vector (0);//出力する値を入れる for(int j = 0;j < M;j++){//ans[i]はBitになっているため、復元 if(ans[i] & (1 << j)){ count++; out.push_back(j+1); } } cout << count << " "; for(int j : out)cout << j << " "; cout << endl; } return 0; }