题目在此: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)的更多相关文章

  1. 八皇后问题解题报告(dfs

    这里是代码传送门 所谓八皇后问题,一开始接触,上学期舍友提及的,但是因为各种原因,水平不够,并没有关心,偶然之间,再次遇见,便进行的尝试(棋盘是0-7的,不是1-8的...开始打弄错了) 所谓八皇后问 ...

  2. Leetcode547 朋友圈解题报告 (DFS

    题目描述: 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋 ...

  3. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

  4. poj分类解题报告索引

    图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...

  5. 北大ACM试题分类+部分解题报告链接

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  6. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  7. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  8. Mutual Training for Wannafly Union #1解题报告

    ---恢复内容开始--- q神等人组织的vjudge上的多校训练,题目基本上都来自于CF,#1是上周进行的,参加后感觉收获很多,因为上周准备期中比较忙,解题报告现在补上. 比赛地址(兼题目地址) A题 ...

  9. NOIP2012普及组 (四年后的)解题报告 -SilverN

    本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告 ...

随机推荐

  1. Windows server 修改mysql端口

    [此方法对mysql免安装版本适用] (最好先停止mysql服务) 1.解压MySQL后,在MySQL根目录下有一个my-default.ini,将该文件复制粘贴一份,重命名为:my.ini,还是放在 ...

  2. [UCSD白板题] Pairwise Distinct Summands

    Problem Introduction This is an example of a problem where a subproblem of the corresponding greedy ...

  3. 手机移动端alert替换方案

    //alert ;(function () { var AlertBox = function (options){ this.defaults = { title:"", cal ...

  4. 关于mysql的access denied 错误解决方案

    mysql -u root -p 按回车,输入密码后提示access denied......ues password YES/NO的错误? 第一步: 这时你需要进入/etc/mysql目录下,然后s ...

  5. WP7系统托盘和应用程序栏

    (一)系统托盘和应用程序栏系统托盘(1)显示系统级别的状态信息(2)Apps能隐藏和显示系统托盘Micosoft.Phone.Shell.SystemTray.IsVisible=true;应用程序栏 ...

  6. halcon车牌的识别

    read_image (Audi2, 'audi2') fill_interlace (Audi2, ImageFilled, 'odd') dev_set_color('green') thresh ...

  7. linux-9基本命令之-查看系统负载 uptime

    uptime  查看系统负载 uptime @1.查看每一秒的刷新一次系统负载运行情况 [root@localhost /]# watch -n uptime 系统当前时间      系统已运行时间 ...

  8. SQL Server选取本周或上一周数据

    有关SQL Server中有关周的数据查询主要思路来自下面这个语句 select getdate(), dateadd(wk, datediff(wk, 0, DateAdd(Day,-1,getda ...

  9. java Map及Map.Entry详解

    Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法. keySet()方法返回值是Map中key值的集合:e ...

  10. 基于正则的INI读写工具类,支持加密解密

    看到这个标题,有人会问,现在都用xml做配置文件了,谁还用INI文件啊!下面来简单对比一下xml和ini: 1.XML功能强大表达能力强,同时扩展性好. 2.它的主要优势是异构平台的整合.通讯. 3. ...