深度优先搜索中的剪枝.pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深度优先搜索中的剪枝;深度优先搜索例题: 拯救少林神棍 (POJ1011);深度优先搜索例题: 拯救少林神棍;深度优先搜索例题: 拯救少林神棍;46;用程序解决: 输入:N节木棒的长度。 输出:能拼成的最小的棍子长度。;解题思路;解题思路;解题思路;解题思路;以N=10,L=57为例: (10节木棒,假设棍子长度是57);;;;;bool Dfs(int R, int M ) 表示: 当前有R根未用木棒,而且当前正在拼的那根棍子比假定的棍子长度还少M, 求在这种情况下能全部否拼成功。;Dfs的基本递推关系: bool Dfs(int R, int M) { if( R == 0 M == 0) return true; //拼接任务完成 如果能找到一根长度不超过M的木棒, 假设长为S,拼在当前棍子上,然后 return Dfs(R – 1,M - S); 如果找不到: return false; };#include iostream #include memory.h #include stdlib.h #include vector #include algorithm using namespace std; int T, N; int L; vectorint anLength; int anUsed[65];//是否用过的标记 int i,j,k; int Dfs(int R, int M);;int main() { while(1) { cin N; if( N == 0 ) break; int nTotalLen = 0; anLength.clear(); for( int i = 0; i N; i ++ ) { int n; cin n; anLength.push_back(n); nTotalLen += anLength[i]; } sort(anLength.begin(),anLength.end(), greaterint()); ; for( L = anLength[0]; L = nTotalLen / 2; L ++ ) { if( nTotalLen % L) continue; memset( anUsed, 0,sizeof(anUsed)); if( Dfs( S,L)) { cout L endl; break; } } if( L nTotalLen / 2 ) cout nTotalLen endl; } // while return 0; };int Dfs( int R, int M) { // M表示当前正在拼的棍子和 L 比还缺的长度 if( R == 0 M == 0 ) return true; if( M == 0 ) //一根刚刚拼完 M = L; //开始拼新的一根 for( int i = 0;i N;i ++) { if( !anUsed[i] anLength[i] = M) { anUsed[i] = 1; if ( Dfs( R - 1, M - anLength[i])) return true; else anUsed[i] = 0;//说明本次不能用第i根 //第i根以后还有用 } } return false; };敢问施主,要多久, 才能拼好呢? 有100多节木棒呢!;恳请施主稍快一点, 让老衲在有生之年,看到 少林神棍修复完工!!;没问题! 用“剪枝”可以解决!; 不要在同一个位置多次尝试相同长度的木棒。 即: 如果某次拼接选择长度为S 的木棒,导致最终失败,则在同一位置尝试下一根木棒时,要跳过所有长度为S 的木棒。;第二种剪枝方案:;;以N=10,L=57为例: (10节木棒,假设棍子长度是57);;;;int Dfs( int R, int M) { // M表示当前正在拼的棍子和 L 比还缺的长度 if( R == 0 M == 0 ) return true; if( M == 0 ) //一根刚刚拼完 M = L; //开始拼新的一根 for( int i = 0;i N;i ++) { if( !anUsed[i] anLength[i] = M) { if( i 0 ) { if( anUsed[i-1] == false anL

文档评论(0)

a13355589 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档