这道题数据量很小很小,我们可以用dfs暴搜来搜索
这是我们的决策树
#include <iostream>
using namespace std;
int n, m;
const int N = 45;
int rq[N];
int g[N][N];
int cnt;
int path;
int ret = 45;
int st;
bool check()
{for (int i = 1; i <= n; i++){int sum = 0;for (int j = 1; j <= m; j++){if ((path >> j) & 1){sum += g[j][i];}}if (sum < rq[i]) return false;}return true;
}
void dfs(int pos)
{if (cnt >= ret) return;if (check()){ret = cnt;st = path;return;}if (pos > m) return;cnt++;path |= (1 << pos);dfs(pos + 1);cnt--;path &= ~(1 << pos);dfs(pos + 1);}int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> rq[i];}cin >> m;for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){cin >> g[i][j];}}dfs(1);cout << ret << " ";for (int i = 1; i <= m; i++){if ((st >> i) & 1){cout << i << " ";}}return 0;
}