重点 之前一直在想 怎么就想不到呢
for(int i=x;i<g;i++)//要从上一个搜的最后一个数开始(因为已经知道前面的没用了) 不然会重复搜 浪费时间(重点剪枝)
不从x开始会超时2个点
#include<bits/stdc++.h>
using namespace std;
int minn=0x3f3f3f3f,n,g,a[30],b[20][30],vis[30],c[30],d[30];
int check()
{
for(int i=0;i<n;i++)
{
if(a[i]>0) return 0;
}
return 1;
}//判断符不符合题目要求
void dfs(int x,int v)
{
if(v>minn) return;
if(check())
{
if(minn>v)
{
minn=v;
for(int i=0;i<v;i++)
{
d[i]=c[i];
}
}//找出最小的个数
return;
}
for(int i=x;i<g;i++)//要从上一个搜的最后一个数开始(因为已经知道前面的没用了) 不然会重复搜 浪费时间(重点剪枝)
{
if(vis[i]==0)//这个饲料没被搜过
{
vis[i]=1;//标记已经被搜
for(int j=0;j<n;j++)
a[j]-=b[i][j];//减掉维生素数量
c[v]=i;//存下路径 (最后要输出)
dfs(i,v+1);
vis[i]=0;
for(int j=0;j<n;j++)
a[j]+=b[i][j];//回朔
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cin>>g;
for(int i=0;i<g;i++)
for(int j=0;j<n;j++)
cin>>b[i][j];
dfs(0,0);
cout<<minn<<" ";
for(int i=0;i<minn;i++)
{
cout<<d[i]+1;
if(i!=minn-1)
cout<<" ";
}
return 0;
}