- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
最近下载
- 十八护理核心制度.doc VIP
- Unit3OurcultureourtresaureReading课件高中英语牛津译林版(2020)选修第三册3.pptx
- JJF(京)159-2025 水质在线电导率仪校准规范.pdf VIP
- GZ104 跨境电子商务赛题第5套-2024年全国职业院校技能大赛双数年拟设赛项赛题.pdf VIP
- 新22J10 无障碍设计.docx VIP
- 杨志人物介绍水浒传.pptx VIP
- 材料科学与工程基础》顾宜第四章课后答案.pptx VIP
- GZ104 跨境电子商务赛题第6套-2024年全国职业院校技能大赛双数年拟设赛项赛题.pdf VIP
- 《PDCA管理循环培训》课件.ppt VIP
- DGTJ08-2206-2024 建筑信息模型技术应用标准(人防工程).pdf VIP
文档评论(0)