ABC404D题解
简单题,直接暴力就行了(话说这题怎么比 B 题还简单),枚举每一个动物园去几次即可,可以加一个剪枝,如果当前方案的花费已经超过或等于目前找到的最小花费,那么退出。
注意:十年 OI 一场空,不开 long long 见祖宗!!
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 105;
int a[N][N];
int ans[N];
int c[N];
int n,m,minn = 1e18;
void dfs(int x,int sum)
{
if(sum>=minn)
{
return;
}
if(x == n+1)
{
int flag = 1;
for(int i = 1;i<=m;i++)
{
int sum = 0;
for(int j = 1;j<=a[i][0];j++)
{
sum+=ans[a[i][j]];
}
if(sum<2)
{
flag = 0;
break;
}
}
if(flag)
{
minn = sum;
}
return;
}
ans[x] = 0;
dfs(x+1,sum);
ans[x] = 1;
dfs(x+1,sum+c[x]);
ans[x] = 2;
dfs(x+1,sum+2*c[x]);
}
signed main()
{
scanf("%lld %lld",&n,&m);
for(int i = 1;i<=n;i++)
{
scanf("%lld",&c[i]);
}
for(int i = 1;i<=m;i++)
{
scanf("%lld",&a[i][0]);
for(int j = 1;j<=a[i][0];j++)
{
scanf("%lld",&a[i][j]);
}
}
dfs(1,0);
printf("%lld",minn);
return 0;
}

浙公网安备 33010602011771号