#include <bits/stdc++.h>
using namespace std;
const int N=30,MAXN=0xfffffff;
int v,g,ans_t=MAXN;
int sd[N],n[N][N],t[N],ans[N];
bool fl[N]={0},flag;
void dfs(int k,int cnt)//第k种饲料,已经选了cnt种饲料
{
flag=1;
for(int i=1;i<=v;i++)//判断是否所有维他命数量都符合要求
{
if(t[i]<sd[i])
{
flag=0; break;
}
}
if(flag==1)
{
if(cnt<ans_t)//需要饲料种类更少,则更新答案
{
ans_t=cnt;
for(int i=1,j=0;j<cnt;i++)
{
if(fl[i]==1)
{
j++;
ans[j]=i;
}
}
}
}
if(k>v) return ;//没有更多饲料选择,结束
if(cnt>=ans_t) return ;//需要饲料种类比已有情况更多,舍弃
fl[k]=1;
for(int j=1;j<=v;j++) t[j]+=n[k][j];
dfs(k+1,cnt+1);//选择第k个饲料
fl[k]=0;
for(int j=1;j<=v;j++) t[j]-=n[k][j];//回溯
dfs(k+1,cnt);//不选择第k个饲料
}
void print()
{
cout<<ans_t<<" ";
for(int i=1;i<=ans_t;i++)
{
cout<<ans[i]<<" ";
}
}
int main()
{
ios::sync_with_stdio(0);
cin>>v;
for(int i=1;i<=v;i++) cin>>sd[i];
cin>>g;
for(int i=1;i<=g;i++)
{
for(int j=1;j<=v;j++)
{
cin>>n[i][j];
}
}
dfs(1,0);
print();
return 0;
}
点7 RE,代码与这条帖子思路基本一致,如果MAXN替换为更小的值则会 WA(和上文那一条帖子一样)
点7数据:
5
163 221 146 425 509
10
98 69 68 18 129
132 185 196 64 176
40 70 57 9 115
73 189 145 87 117
45 114 45 0 18
137 137 174 73 178
48 143 33 142 192
33 107 148 2 158
32 42 153 90 41
165 81 156 7 121