tle 90分,#2 码风优良求助

P1460 [USACO2.1] 健康的荷斯坦奶牛 Healthy Holsteins

```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


|