Analysis
这道题是搜索,类似于小木棍,加一些剪枝。
第一个剪枝是如果当前的答案已经大于了我们已知的最小答案,不用说直接return返回即可。
第二个剪枝是我们可以将小猫的体重从大到小排序,这样我们的搜索树就会缩短许多。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 18+10 6 using namespace std; 7 typedef long long ll; 8 inline int read() 9 { 10 int x=0; 11 bool f=1; 12 char c=getchar(); 13 for(; !isdigit(c); c=getchar()) if(c=='-') f=0; 14 for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0'; 15 if(f) return x; 16 return 0-x; 17 } 18 inline void write(int x) 19 { 20 if(x<0){putchar('-');x=-x;} 21 if(x>9)write(x/10); 22 putchar(x%10+'0'); 23 } 24 int n,w,ans=99999999,l; 25 int c[maxn],e[maxn]; 26 bool book[maxn]; 27 inline bool cmp(int a,int b){return a>b;} 28 inline void dfs(int af,int la,int step,int cnt) 29 { 30 bool flag=0; 31 int i; 32 if(step>=ans)return; 33 if(cnt==n+1) 34 { 35 ans=step; 36 return; 37 } 38 for(i=n;i>=af;i--) 39 if(book[i]==0&&c[i]<=la) 40 { 41 flag=1; 42 break; 43 } 44 if(flag==0) 45 { 46 for(i=1;i<=n;i++) 47 if(book[i]==0) 48 break; 49 book[i]=1; 50 dfs(i,w-c[i],step+1,cnt+1); 51 book[i]=0; 52 return; 53 } 54 for(i=af;i<=n;i++) 55 { 56 if(book[i]==0&&c[i]<=la) 57 { 58 book[i]=1; 59 dfs(i,la-c[i],step,cnt+1); 60 book[i]=0; 61 if(c[i]==la||la==w)return; 62 i=e[i]; 63 } 64 } 65 66 } 67 int main() 68 { 69 n=read();w=read(); 70 for(int i=1;i<=n;i++)c[i]=read(); 71 sort(c+1,c+n+1,cmp); 72 e[n]=n; 73 for(int i=n-1;i>0;i--) 74 { 75 if(c[i+1]==c[i])e[i]=e[i+1]; 76 else e[i]=i; 77 } 78 dfs(1,w,0,1); 79 write(ans+1); 80 return 0; 81 }
请各位大佬斧正(反正我不认识斧正是什么意思)