UVA307 小木棍 Sticks
我枯辽
然后导致一直爆炸,就是调试一直就跳回初始状态然后就输出sum 我的一上午就这样么得了
还有关于小蓝书上面的程序是错 但剪枝是真的阔以 就是有一些奇奇怪怪我看不懂的剪枝
关于剪枝
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=100+5; 4 bool v[N]; 5 int len,n,a[N],sum,m; 6 template<class t>void rd(t &x) 7 { 8 x=0;int w=0;char ch=0; 9 while(!isdigit(ch)) w|=ch=='-',ch=getchar(); 10 while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); 11 x=w?-x:x; 12 } 13 bool cmp(int a,int b) {return a>b;} 14 15 bool dfs(int cnt,int l,int last) 16 { 17 if(cnt==m) return 1; 18 if(l==len) return dfs(cnt+1,0,1); 19 int fail=0; 20 for(int i=last;i<=n;i++) 21 { 22 if(v[i]==0&&a[i]+l<=len&&fail!=a[i]) 23 { 24 v[i]=1; 25 if(dfs(cnt,l+a[i],i)) return 1; 26 v[i]=0;fail=a[i];//回溯 当前长度失败了 27 if(l==0||l+a[i]==len) return 0; 28 } 29 } 30 return 0; 31 } 32 33 int main() 34 { 35 while(scanf("%d",&n)&&n) 36 { 37 sum=0; 38 for(int i=1;i<=n;i++) {rd(a[i]);sum+=a[i];} 39 sort(a+1,a+n+1,cmp);//排序 40 for(len=a[1];len<=(sum>>1);len++) 41 { 42 if(sum%len) continue; 43 m=sum/len; 44 memset(v,0,sizeof(v)); 45 if(dfs(1,0,1)) {printf("%dn",len); break;} 46 } 47 if(len>sum>>1) printf("%dn",sum); 48 } 49 return 0; 50 }100昏
这几天沉迷于水题无法自拔 是我太水了
转载于:.html
本文发布于:2024-02-02 11:08:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170684330043388.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |