洛谷 P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins (dfs)

https://www.luogu.com.cn/problem/P1460

题目大意:给定每一头牛需要的n种营养,

给定m种饲料,每一种饲料含有不同的所需要的营养含量

让我们用最少的数量(每一种饲料只能用一次)

达到牛所需要的营养总数
输入 #1
4
100 200 300 400
3
50  50  50  50
200 300 200 300
900 150 389 399

输出 #1
2 1 3

不需要剪枝的爆搜

注意dfs时的顺序dfs(1,0);
1 2 3
1 2
1 3
1
2 3
2
3

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
int n,m;
int a[N],b[M][M],ans[N],res[N];
int minn=20;
bool check(int x)
{
    for(int i=1;i<=n;i++)
    {
        int sum=0;
        for(int j=1;j<=x;j++)//我们选中的x头牛,分别把每一部分的营养汇总起来,看看达不达标
        {
            sum+=b[res[j]][i];//这个地方我们因为还没有正式插入答案数组中,所以还是采用原数组进行计算
        }
        if(sum<a[i]) return false;
    }
    return true;
}
void dfs(int id,int sz)//id表示m种饲料随机选到哪里了,sz表示选中的大小
{
    if(id==m+1)
    {
        if(check(sz)==true&&sz<minn)
        {
            minn=sz;
            for(int i=1;i<=sz;i++)
                ans[i]=res[i];
        }
        return ;
        /*for(int i=1;i<=sz;i++)
            cout<<res[i]<<" ";
        cout<<endl;
        return ;*/
    }
    res[sz+1]=id;
    dfs(id+1,sz+1);
    dfs(id+1,sz);
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n;//n头奶牛
        for(int i=1;i<=n;i++)//a表示每一头奶牛需要的均衡营养
            cin>>a[i];
        cin>>m;//m种饲料
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                cin>>b[i][j];
            }
        }
        dfs(1,0);//从第一个位置开始填放,从第一种饲料开始计算
        cout<<minn<<" ";
        for(int i=1;i<=minn;i++)
            cout<<ans[i]<<" ";
        cout<<endl;
    }
    return 0;
}
/*
1 2 3
1 2
1 3
1
2 3
2
3
*/
posted @ 2022-09-06 16:27  Vijurria  阅读(52)  评论(0编辑  收藏  举报