```cpp
#include<bits/stdc++.h>
using namespace std;
int v,v0[30],g,g0[20][30],c[20],ans=1e9,r[30],ans0[30];
bool c0[20];
void dfs(int x,int last){
if(x-1>g) return ;
if(x-1>ans) return ;
int sum=0;
for(int i=1;i<=v;i++){
if(v0[i]<=c[i]) sum++;
else break;
}
if(sum==v){
ans=min(ans,x-1);
if(ans==x-1){
for(int i=1;i<=x;i++){
ans0[i]=r[i];
}
}
return ;
}
for(int i=last+1;i<=g;i++){
if(!c0[i]){
r[x]=i;
c0[i]=1;
for(int j=1;j<=v;j++) c[j]+=g0[i][j];
dfs(x+1,i);
for(int j=1;j<=v;j++) c[j]-=g0[i][j];
c0[i]=0;
}
}
}
int main(){
cin>>v;
for(int i=1;i<=v;i++) cin>>v0[i];
cin>>g;
for(int i=1;i<=g;i++){
for(int j=1;j<=v;j++) cin>>g0[i][j];
}
dfs(1,0);
cout<<ans<<' ';
sort(ans0+1,ans0+1+ans);
for(int i=1;i<=ans;i++) cout<<ans0[i]<<' ';
return 0;
}
```
第23行为什么要倒着枚举?
修改了23行处及其他出现变量“last”的地方,用于去重
如果按照你原来的写法,假设有两袋肥料1和2,那么1,2和2,1两种序列都会被搜索到,造成时间开销
by Obijeb @ 2024-04-16 19:58:31
@[DD20070520](/user/605333) 感谢已关注,其实倒着枚举是想着最后不用排序了(因为最开始没想着去重)
by zombiell810975 @ 2024-04-16 20:06:03