code
/*Siberian Squirrel*/
/*Cute JinFish*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1), eps = 1e-8;
/*const int MOD = 998244353, r = 119, k = 23, g = 3;
const int MOD = 1004535809, r = 479, k = 21, g = 3;*/
const int INF = 0x3f3f3f3f, MOD = 1e9 + 7;
const int M = 3e2 + 10, N = 5e6 + 10;
int sgn(double x) {
if(fabs(x) < eps) return 0;
return x < 0? -1: 1;
}
//inline int rnd(){static int seed=2333;return seed=(((seed*666666ll+20050818)%998244353)^1000000007)%1004535809;}
//double Rand() {return (double)rand() / RAND_MAX;}
int n, k, v[M], t[M], last[M];
int a[M][M], up = M;
ll quick_pow(ll ans, ll p, ll res = 1) {
for(; p; p >>= 1, ans = ans * ans % MOD)
if(p & 1) res = res * ans % MOD;
return res % MOD;
}
void init() {
}
bool check(int x) {
for(int i = 1; i <= n; ++ i) {
int ans = 0;
for(int j = 1; j <= x; ++ j) {
ans += a[t[j]][i];
}
if(ans < v[i]) return false;
}
return true;
}
void dfs(int pos, int m) {
if(pos > k) {
if(check(m) && m < up) {
up = m;
for(int i = 1; i <= up; ++ i) {
last[i] = t[i];
}
}
return;
}
t[m + 1] = pos;
dfs(pos + 1, m + 1);
dfs(pos + 1, m);
}
void solve(ll res = 0) {
dfs(1, 0);
cout << up << ' ';
for(int i = 1; i <= up; ++ i) {
cout << last[i] << ' ';
}
cout << endl;
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(nullptr);
// srand(time(0));
#ifdef ACM_LOCAL
freopen("input", "r", stdin);
freopen("output", "w", stdout);
#endif
init();
int o = 1;
// cin >> o;
while(o --) {
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> v[i];
cin >> k;
for(int i = 1; i <= k; ++ i) {
for(int j = 1; j <= n; ++ j)
cin >> a[i][j];
}
solve();
}
return 0;
}
题目描述
农民 John 以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。
给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。
维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。
输入格式
第一行一个整数 vvv,表示需要的维他命的种类数。
第二行 vvv 个整数,表示牛每天需要的每种维他命的最小量。
第三行一个整数 ggg,表示可用来喂牛的饲料的种数。
下面 ggg 行,第 nnn 行表示编号为 nnn 饲料包含的各种维他命的量的多少。
输出格式
输出文件只有一行,包括牛必需的最小的饲料种数 ppp;后面有 ppp 个数,表示所选择的饲料编号(按从小到大排列)。
如果有多个解,输出饲料序号最小的(即字典序最小)。