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,终于大功告 ...
随机推荐
- First Missing Positive && missing number
https://leetcode.com/problems/first-missing-positive/ 我原以为数组中不会有重复的数字,所以利用min.max分别记录给定数组中出现的最小正整数和最 ...
- hdu 1394 Minimum Inversion Number(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个0 — n-1的排列,对于这个排列你可以将第一个元素放到最后一个,问你可能得到的最 ...
- Java生成不重复的数的方法
在开发时要给某些表加上编号,而且编号是唯一的,自己用时间生成了下,觉得可能存在并发情况.所以在网上查了一下,就是随机生成.方法如下: //方法一(用当前时间精确到毫秒,截取任意几位) Date dat ...
- 浅谈产品测试人员的KPI
浅谈产品测 ...
- Hyper-V初涉_共享式网络链接
任何一台计算机,如果不能与网络连通,可以说已经失去了大部分的功能,Windows 8尤是如此,虚拟机亦是如此. Hyper-V并不能对物理机的网卡进行识别,所以需要借助虚拟网卡通过物理机的网络共享实现 ...
- PADSPCB权威指南-第三章 预处理(部分)(原创)
PADSPCB权威指南-第三章(部分)豆丁地址:http://www.docin.com/p-707132066.html
- kali基本设置
一.更换比较快的软件源 修改sources.list文件(su): leafpad /etc/apt/sources.list #debain源 deb http://mirrors.163.com/ ...
- Replication的犄角旮旯(二)--寻找订阅端丢失的记录
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- .NET Core也可以使用MongoDB了
可能是由于.NET Core还不是正式版的缘故吧,MongoDB的官方Driver(http://mongodb.github.io/mongo-csharp-driver/)一直不支持.NET Co ...
- 软件工程课设day3
下载昨日新版本程序,完成修复项目的测试. 与组内成员讨论,确认项目新模块功能“吐槽墙”的设计方向与实现形式——因为项目为便捷工具类,社区形式的实现方式与项目本质背道而驰.因此决定以“点击目标课程条目, ...