洛谷 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
*/