一道搜索题,应该还是之前搜索的能力还不够,这道题我也做了好长时间,收获还是蛮大的,之前写dfs就完全是套用写全排列的模板,结果放到这题就超时了。
还是枚举所有的可能性,这种枚举方法在标记相同个数时还是按字典序排列的,具体看代码
#include <cstdio>
#include <cstring>
int a[25], b[20][25];
bool vis[20], r[20];
int n, m;
int ans;
bool ok()
{
for(int i=1; i<=n; i++)
{
int sum = 0;
for(int j=1; j<=m; j++)
sum += vis[j] * b[j][i];
if(sum < a[i])
return 0;
}
return 1;
}
void dfs(int cur)
{
if(cur == m+1)
{
if(ok())
{
int count = 0;
for(int i=1; i<=m; i++)
if(vis[i])
count++;
if(ans < count)
{
ans = count;
for(int i=1; i<=m; i++)
r[i] = vis[i];
}
}
return;
}
vis[cur] = 1;
dfs(cur + 1);
vis[cur] = 0;
dfs(cur + 1);
}
int main()
{
while(scanf("%d", &n) == 1)
{
memset(vis, 0, sizeof(vis));
memset(r, 0, sizeof(r));
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
scanf("%d", &m);
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
scanf("%d", &b[i][j]);
ans = 0;
dfs(1);
printf("%d", ans);
for(int i=1; i<=m; i++)
if(r[i])
printf(" %d", i);
printf("\n");
}
return 0;
}