重点 之前一直在想 怎么就想不到呢
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;
}