#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<set>
#define maxn 30
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define LL long long
#define e 2.71828182
using namespace std;
int n,m;
struct node
{
int f[maxn];
}snack[maxn];
bool book[maxn];
int need[maxn];
int curz[maxn];
bool flag;
int kind;
void dfs(int step,int cur)
{
flag=true;
for(int i=0;i<n;i++)
{
if(curz[i]<need[i])
{
flag=false;
break;
}
}
if(flag)
return ;
if(step>kind)
return ;
//剪枝,
//这里要明白,在前一层递归,已经吃掉了序号为cur的食品
//因此,不需要再吃序号在cur之前的食品,否则会出现1、2、3、4和1、2、4、3这样的重复序列
for(int i=cur;i<m;i++)
{
if(book[i]==false)
{
for(int j=0;j<n;j++)
{
curz[j]+=snack[i].f[j];
}
book[i]=true;
dfs(step+1,i);
if(flag)
return ;
book[i]=false;
for(in t j=0;j<n;j++)
{
curz[j]-=snack[i].f[j];
}
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>need[i];
}
cin>>m;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cin>>snack[i].f[j];
}
int zm;
for(int i=1;i<=m;i++)
{
kind=i;
flag=false;
memset(book,false,sizeof(book));
dfs(1,0);
if(flag)
{
zm=i;
break;
}
}
cout << zm ;
for(int i=0;i<m;i++)
{
if(book[i]==true)
cout << ' ' << i+1;
}
cout << endl;
return 0;
}
DFS+枚举(强迫症的吃货 计蒜客)
最新推荐文章于 2024-02-07 23:30:11 发布