POJ1014 解题报告(DFS)
题目在此:http://poj.org/problem?id=1014
要看清题意呢,题中要求输入的是价值分别为1,2,3,4,5,6的大理石的个数,而不是6块价值为输入数字的大理石!选这个题主要想练习一下深搜。在网上看到了一段代码,深搜时使用了贪心算法虽然可以AC但是有很大的漏洞:
如测试数据(0 0 3 0 3 1)便会出现错误:
搜索时候会选中:价值为6,5,3的各一个进而判断出不可以分割。但是正确的分割方式应该是6+3+3+3=15。
这个是网上有漏洞的代码:
#include<iostream>
using namespace std; int amount[] = {};
int half_value = ;
int flag = ; void DFS(int value, int pre){ if(value == half_value){
flag = ;
return;
} if(flag == ){ //这个可以去掉的啊!
return;
} int i = ;
for(i = pre; i > ; i--){
if(amount[i]){
if(i + value <= half_value){
amount[i]--;
DFS(i + value, i); if(flag == ){ //不可少的,感受其作用,让递归栈中所有DFS结束
return;
}
}
}
}
} int main(){ int testcase = ;
while(true){
flag = ;
int totalvalue = ;
int N = ;
int i = ;
while(i <= N){
cin >> amount[i];
totalvalue += amount[i] * i;
i++;
} if(!amount[] && !amount[] && !amount[] && !amount[] && !amount[] && !amount[]){
break;
} printf("Collection #%d:\n", testcase++);
if(totalvalue % != ){
cout << "Can't be divided." << endl << endl;
continue;
} half_value = totalvalue / ;
DFS(, ); if(flag){
cout << "Can be divided." << endl;
} else {
cout << "Can't be divided." << endl;
}
cout << endl;
}
return ;
}
有漏洞的代码
为了解决这个问题,在判定不能分割之前又加入了一个循环,即从价值为5,4...1的大理石开始深搜,这样就避免了以上代码的漏洞。因为贪心算法基本解决了大部分的情况,故这个循环不会引起超时。以下是修改过的代码:
#include<iostream>
#include <string.h>
#include<stdio.h>
using namespace std; int amount[] = { };
int temp_amount[] = { };//存下原始输入值
int half_value = ;
int flag = ; void DFS(int value, int pre)
{
if (value == half_value)
{
flag = ;
return;
} int i = ;
for (i = pre; i > ; i--)
{
if (amount[i]) {
if (i + value <= half_value)
{
amount[i]--;
DFS(i + value, i); if (flag == )
{
return;
}
}
}
} }
int main() { int testcase = ;
while (true)
{
flag = ;
int totalvalue = ;
int N = ;
int i = ;
while (i <= N)
{
cin >> temp_amount[i];
totalvalue += temp_amount[i] * i;
i++;
} if (!temp_amount[] && !temp_amount[] && !temp_amount[] && !temp_amount[] && !temp_amount[] && !temp_amount[])
{
break;
}
printf("Collection #%d:\n", testcase++);
if (totalvalue % != )
{
cout << "Can't be divided." << endl << endl;
continue;
}
half_value = totalvalue / ; memcpy(amount, temp_amount, * sizeof(int));
DFS(, ); if (flag)
cout << "Can be divided." << endl; else
{
for (int m = ; m >= ; m--)
{
if (!flag)
{
memcpy(amount, temp_amount, * sizeof(int));//因为amount数组已经被操作,故需要恢复
DFS(, m);
}
}
if (!flag)
cout << "Can't be divided." << endl;
else
cout << "Can be divided." << endl;
}
cout << endl;
}
return ;
}
(以后再进行补充呃)
POJ1014 解题报告(DFS)的更多相关文章
- 八皇后问题解题报告(dfs
这里是代码传送门 所谓八皇后问题,一开始接触,上学期舍友提及的,但是因为各种原因,水平不够,并没有关心,偶然之间,再次遇见,便进行的尝试(棋盘是0-7的,不是1-8的...开始打弄错了) 所谓八皇后问 ...
- Leetcode547 朋友圈解题报告 (DFS
题目描述: 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋 ...
- 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...
- poj分类解题报告索引
图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...
- 北大ACM试题分类+部分解题报告链接
转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- Mutual Training for Wannafly Union #1解题报告
---恢复内容开始--- q神等人组织的vjudge上的多校训练,题目基本上都来自于CF,#1是上周进行的,参加后感觉收获很多,因为上周准备期中比较忙,解题报告现在补上. 比赛地址(兼题目地址) A题 ...
- NOIP2012普及组 (四年后的)解题报告 -SilverN
本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告 ...
随机推荐
- Android应用:横竖屏切换总结
眨眼间,已经到了2016你年春节前,离上一篇博客的时间已经有6个月多,回想起这半年的种种,不得不说,学习和工作实在是太忙了,或许这就是程序员的真实写照吧. 写博客之初,主要的目的还是为了把自己的学习痕 ...
- Swift语法简介(一)
或许网络上有很多成型的介绍,我只想写下来留给自己.欢迎批评.开撸! 1.第一个程序,Hello,world!古人云,学会了Hello,world!这门语言你就掌握了一半了. print("H ...
- iOS游戏截图或广告图尺寸要求
统一的标准:72 dpi,RGB,扁平化,非透明,高质量的JPEG或者PNG文件格式 ====================================================== 3. ...
- Firebird数据库系统的开发团队
下载Firebird3的发布文档,上面列出了开发团队,仔细看了看,原来俄罗斯人是主导(内核开发),法国人.智利人.巴西人.日本人.荷兰人.捷克人都有.共17人,3人全职. able 13.1. Fir ...
- 《Linux内核分析》之第三章读书笔记
进程管理 进程是处于执行期的程序以及相关的资源的总称,也称作任务.执行线程,简称线程,是在进程中活动的对象. 可以两个或两个以上的进程执行同一个程序 也可以两个或两个以上并存的进程共享许多资源 内核调 ...
- 【转】VC中的字符串处理
http://hi.baidu.com/nmn714/item/ab8d2a96d0f2d6f228164727 貌似不少人刚开始做windows程序时都会纠结在字符串处理上,所以我把关于字符串处理的 ...
- 《理解 ES6》阅读整理:函数(Functions)(六)Purpose of Functions
明确函数的双重作用(Clarifying the Dual Purpose of Functions) 在ES5及更早的ES版本中,函数调用时是否使用new会有不同的作用.当使用new时,函数内的th ...
- unity 状态机 + svn + 码云 上篇
最近刚找到在实习,忙于公司一个c++ 项目 ,一直想写博客来着,没时间写今天熬夜打算先献上自己前几天自己封装的一个fsm状态机 话不多说,直接上正题,这篇博客主要是在学校的时候状态机一直使用的是pla ...
- SQL入门经典(三) 之连接查询
上一篇介绍到查询.这一篇主要讲连接查询,将介绍INNER JOIN,OUTER JOIN(LEFT和RIGHT),FULL JOIN,CROSS JOIN. 连接顾名斯义就是把多个数据表数据合并到一个 ...
- DataTable汇总
一.排序 1 获取DataTable的默认视图 2 对视图设置排序表达式 3 用排序后的视图导出的新DataTable替换就DataTable (Asc升序可省略,多列排序用"," ...