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,终于大功告 ...
随机推荐
- House Robber III leetcode 动态规划
https://leetcode.com/submissions/detail/56095603/ 这是一道不错的DP题!自己想了好久没有清晰的思路,参看大神博客!http://siukwan.sin ...
- IE跨域访问问题
可能出现的症状: 1.跨域无法登录. 2.同一页面请求同一域名SESSION无法获取.(SESSION_ID一直在变) 一般情况下在方法前加上以下代码: header("P3P: CP=CU ...
- p68 对数变换 关于fft2 fftshift 频谱
p68 频谱:绝大多数信号可分解若干不同频率的正弦波, 些正弦波中,频率最低的称为信号的基波,其余称为信号谐波,相当于该信号的基本频率.频率等于基频整数倍的正弦波分量称为谐波. 1.fft2 fft ...
- windows 7下qtcreator里QWT文件的pro配置
http://blog.chinaunix.net/uid-20717410-id-272331.html 把编译好的qwt的include文件夹下面 所有的.h文件 复制到qt目录下 然后在pro里 ...
- TestNG教程
TestNG教程 http://www.yiibai.com/testng/2013/0916311.html TestNG,3种执行方式: 1.ant(build.xml) 2.Eclipse(安装 ...
- Reactnative 随笔一
---恢复内容开始--- 1.ReactDOM.render() React的最基本方法,用于将模板转为HTML语言,并插入指定的DOM节点 将h标签插入example节点 2.HTML语言直接 ...
- ASP.NET连接远程Oracle数据库,提示试图加载格式不正确的程序
VS调试远程连接Oracle数据库,一直报错 由于本地计算机是64位的操作系统,而且也确定安装的Oracle客户端是64位的 ,但是一直提示这个错误. 试了很多方法,终于发现可能是 不能在VS中调试的 ...
- 蛙蛙推荐:快速自定义Boostrap样式
现在越来越多的网站使用Bootstrap,相信大家也审美疲劳了,所以我们要用Bootstrap的第一步就是先把顶部的导航栏来自定义一下. 我现在使用的是bootstrap3.0,顶部导航定义如下 &l ...
- Homework 1 -- The beginning
我是在北京在读的一位大学生.如果问我学的什么专业,我会用一个冷笑话回答你:我精通多种语言,在老家我说家乡话:跟北京我讲普通话:跟老外就玩English:我跟机器得敲代码.现在你知道我学的就是计算机了. ...
- memcache(三)内存管理
memcached(三)内存管理 memcached使用预申请的方式来管理内存的分配,从而避免内存碎片化的问题.如果采用mallo和free来动态的申请和销毁内存,必然会产生大量的内存碎片. 基本知识 ...