思路 : 二进制枚举
因为数据量很小,数据只有25和15,因此二进制枚举妥妥的
需要注意的是题目中要求下标从1开始,后面记录的时候如果开始是从0开始的记得+1
小tips
c++中将一个vector里的东西复制给另一个vector,可以像下面一样(都是将v1赋值给v2)
vector<int> v2(v1);
或者是
vector<int> v2;
v2.assign(v1.begin(), v1.end());
或者是
vector<int> v1;
v2.swap(v1);
或者是
vector<int>::iterator it;// 声明迭代器
for(it = v1.begin(); it!=v1.end(); it++) { // 遍历v1,赋值给v2
v2.push_back(it);
}
代码
/**
- @Author: chelly
- @Date: 2022-10-05 16:45:11
- 二进制枚举
*/
include <bits/stdc++.h>
define pb push_back
define fi first
define se second
define all(x) (x).begin(), (x).end()
define SZ(x) (int) (x).size()
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef vector
typedef double db;
int v, cv[30], g, cg[20][30], tmp[30], cnt, res = 0x3f3f3f3f;
VI path;
void solve() {
cin >> v;
for (int i = 0; i < v; i++) cin >> cv[i];
cin >> g;
for (int i = 0; i < g; i++)
for (int j = 0; j < v; j++)
cin >> cg[i][j];
for (int i = 0; i < (1 << g); i++) { // 枚举饲料选择情况
memset(tmp, 0, sizeof(tmp));
cnt = 0;
VI tpath;
for (int j = 0; j < g; j++) { // 枚举饲料
if ((i >> j) & 1) {
tpath.pb(j+1); // 注意,题目中的下标从1开始
for (int k = 0; k < v; k++) {
tmp[k] += cg[j][k];
}
cnt++;
}
}
bool norm = 1;
for (int j = 0; j < v; j++) {
if (tmp[j] < cv[j]) {
norm = 0;
break;
}
}
if (norm) {
if (res > cnt) {
path = VI(tpath); // 将tpath的值赋给path
res = cnt;
}
}
}
cout << res << ' ';
for (auto &a: path) cout << a << ' ';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
solve();
return 0;
}
标签:荷斯坦,int,++,v2,v1,枚举,vector,AcWing1362
From: https://www.cnblogs.com/chelly-algorithm/p/16755951.html