AcWing 1362. 健康的荷斯坦奶牛(DFS枚举所有情况)
原题链接
简单
作者:
Vason
,
2024-04-17 11:20:14
,
所有人可见
,
阅读 5
n、m傻傻分不清,调了好久
#include <iostream>
#include <cstring>
using namespace std;
const int N = 50;
int v[N], w[N][N], a[N], n, m;
int path[N], ans;
bool st[N];
bool check()
{
memset(a, 0, sizeof a);
for(int i = 1; i <= m; i ++)
if(st[i])
{
for(int j = 1; j <= n; j ++) a[j] += w[i][j];
}
for(int i = 1; i <= n; i ++)
if(v[i] > a[i])
{
return false;
}
int k = 0;
for(int i = 1; i <= m; i ++)
if(st[i]) path[k ++] = i;
ans = k;
return true;
}
void dfs(int u, int d)
{
if(u > m)
{
if(d < ans) check();
return;
}
st[u] = true;
dfs(u + 1, d + 1);
st[u] = false;
dfs(u + 1, d);
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%d", &v[i]);
scanf("%d", &m);
for(int i = 1; i <= m; i ++)
for(int j = 1; j <= n; j ++)
scanf("%d", &w[i][j]);
ans = m + 1;
dfs(1, 0);
printf("%d ", ans);
for(int i = 0; i < ans; i ++) printf("%d ", path[i]);
return 0;
}