代码思路:
蒟蒻不会搜索,就用二进制分解的方法,枚举 ii 从 11 (至少有一个)到 2^g2 g ,然后每次对 ii 进行分解二进制并且判断合法,如果现在的长度最小,则储存,并保存字典序最小的。但不知为何 WA 了第 99 个点。
代码:
#include <bits/stdc++.h>
using namespace std;
#define KIND 26
#define FOOD 16
int v, g, length = INT_MAX, start, cnt;
int cneed[KIND], sum[KIND], food[FOOD][KIND];
vector<int> tim, minn;
bool check(){
for (int i=1; i<=v; i++){
if (sum[i] < cneed[i]) return false;
}
return true;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> v;
for (int i=1; i<=v; i++) cin >> cneed[i];
cin >> g;
for (int i=1; i<=g; i++){
for (int j=1; j<=v; j++) cin >> food[i][j];
}
for (int i=1; i<=(1 << g); i++){
memset(sum, 0, sizeof(sum));
cnt = 0;
tim.clear();
for (int j=1; j<=g; j++){
if (i/j&1){
for (int k=1; k<=v; k++) sum[k] += food[j][k];
cnt++;
tim.push_back(j);
}
}
if (check() && cnt < length){
length = cnt;
minn = tim;
// cout << length << '\n';
}
}
cout << length << ' ';
for (int i=0; i<minn.size(); i++) cout << minn[i] << ' ';
return 0;
}