POJ1011【判重剪枝】
来源:互联网 发布:淘宝评价过期怎么办 编辑:程序博客网 时间:2024/05/08 12:09
题意:
给你一堆棒子,这些棒子是你从一堆一样的棒子折断而来的,
现在你忘记了是从那一堆一样的棒子的长度,让你写一个程序,求最短的长度。
思路:
首先这个棒长肯定是和的约数,且大于最大值。
然后是sort一下棒子长度从大到小(我也不知道为啥可行)
最后就是一个判重剪枝:
注意判重剪枝,是对相同情况的剪枝,这个相同情况就是要非常相同!
给你一堆棒子,这些棒子是你从一堆一样的棒子折断而来的,
现在你忘记了是从那一堆一样的棒子的长度,让你写一个程序,求最短的长度。
思路:
首先这个棒长肯定是和的约数,且大于最大值。
然后是sort一下棒子长度从大到小(我也不知道为啥可行)
最后就是一个判重剪枝:
注意判重剪枝,是对相同情况的剪枝,这个相同情况就是要非常相同!
这里代码那个!vis[i]很有体会啊;
//#include <bits/stdc++.h>#include<iostream>#include<cstdio>#include<queue>#include<math.h>#include<string.h>#include<algorithm>using namespace std;typedef long long LL;typedef pair<int,int> PII;int n,a[65];int multi[550],sum;bool cmp(int x,int y){ return x>y;}int solve(int x,int temp){ int num=0; int q=(int)sqrt((double)x); for(int i=1;i<=q;i++) if(x%i==0){ if(i>=temp) multi[num++]=i; if((x/i)>=temp) multi[num++]=x/i; } return num;}bool vis[65];int flag;void DFS(int num,int len,int cur){ if(flag==1) return; if(num*len==sum) { flag=1; return; } int tempcur=cur,tempnum=num; if(cur==0) { int x=1; while(vis[x]) x++; cur+=a[x]; if(cur==len) { cur=0; num++; } vis[x]=1; DFS(num,len,cur); vis[x]=0; cur=tempcur; num=tempnum; return; } for(int i=1;i<=n;i++) { if(vis[i]||cur+a[i]>len) continue; if(i>1&&a[i-1]==a[i]&&!vis[i-1]) // !vis[i-1]要保证相同情况; continue; cur+=a[i]; if(cur==len) { num++; cur=0; } vis[i]=1; DFS(num,len,cur); vis[i]=0; num=tempnum; cur=tempcur; }}int main(){ while(scanf("%d",&n)&&n){ int tmx=0; sum=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; tmx=max(tmx,a[i]); } sort(a+1,a+n+1,cmp); int num=solve(sum,tmx); sort(multi,multi+num); flag=0; for(int i=0;i<num;i++) { memset(vis,0,sizeof(vis)); DFS(0,multi[i],0); if(flag==1) { printf("%d\n",multi[i]); break; } } } return 0;}
0 0
- POJ1011【判重剪枝】
- hdu 2610 dfs+判重剪枝
- 1poj1011(dfs剪枝)
- POJ1011-Sticks DFS+剪枝
- poj1011 Sticks(dfs+剪枝)
- poj1011(深搜+剪枝)
- POJ1011 Sticks 【剪枝】
- poj1011 Sticks(搜索+剪枝)
- poj1011 Sticks(搜索剪枝)
- POJ1011 Sticks DFS+剪枝
- dfs+剪枝 poj1011
- POJ1011- DFS+剪枝
- POJ1011 经典DFS+剪枝
- poj1011 dfs 剪枝
- poj1011 木棒 dfs+剪枝
- POJ1011 Sticks【DFS+剪枝】
- POJ1011 搜索+剪枝【很好】
- poj1011 && uva307 DFS + 剪枝
- java线程(上)——线程状态及属性详解
- QtQuick 技巧 5
- python 批量下载并安装deb包
- 【完结】基于upnp的DIAL协议的分析
- 排队接水
- POJ1011【判重剪枝】
- tween.js可生成平滑动画效果的js动画库效果演示
- eclipse js 报错解决办法
- 微信浏览器调用手机摄像头录像
- 如何快速转发csdn博客?
- yii框架初始安装
- PAT 1013 数素数
- web开发中的四个域对象生命周期 作用域详细介绍
- android 图片点击一下就放大到全屏,再点一下就回到原界面