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;
}
posted @ 2025-05-04 18:28  林晋堃  阅读(259)  评论(0)    收藏  举报