首页 > zoj 1204 Additive equations

zoj 1204 Additive equations

ACCEPT

acm作业
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204

因为老师是在集合那里要我们做这道题。所以我很是天真的就以为要用集合做,结果发现网上都是用数组简单明了地实现了,显得我的代码,特么地超级恶心!!!!!!!
在这里存档一下,别人就不要看了,ZOJ的格式也真是恶心。。。居然因为这个也弄了好久,应该只有我一个人用这么 没脑的集合方式做吧。。真的是哭瞎在厕所里!!!
//#include "stdafx.h"
#include"stdio.h"
#include"iostream"
#include
using namespace std;
int tem[33] = { 0 };//存放加数 以便输出
int i = 0;
int flag = 0;
int c_sum=0;
void dfs(set &c_iset, set::iterator c_iterator, int de, int num)//num为加数个数
{set::iterator set_iter1;if (num == 2)//两个加数时{for (set_iter1 = c_iterator, set_iter1++; *set_iter1 <*c_iset.rbegin(); set_iter1++)//set_iter1++,指向下一个、这里实现的是第二个加数{//c_sum = 0;tem[de] = *set_iter1;c_sum += tem[de];
// 			for (int k = 0; tem[k] != 0; k++)
// 			{
// 				c_sum = c_sum + tem[k];
// 			}if (c_iset.find(c_sum) != c_iset.end())//找到sum 成功可输出 {flag = 1;//成功标志printf("%d", tem[0]);for (int j = 1; tem[j] != 0; j++){printf("+%d", tem[j]);}printf("=%d
", c_sum);}if (c_sum >= *c_iset.rbegin())//结束,不必再继续递归下去{tem[de] = 0;//重置为0 ,已经输出过了return;}c_sum -= tem[de];//dfs(c_iset, set_iter1, de + 1);//到下一个数}}else{for (set_iter1 = c_iterator, set_iter1++; *set_iter1 <*c_iset.rbegin(); set_iter1++)//set_iter1++,指向下一个、这里实现的是第二个加数{tem[de] = *set_iter1;//减少一个数c_sum = 0;for (int k = 0; tem[k] != 0; k++){c_sum = c_sum + tem[k];}if (c_sum > *c_iset.rbegin())//超过最后一个没有必要再进行下去了{tem[de] = 0;return;}num--;dfs(c_iset, set_iter1, de + 1, num);num++;}}tem[de] = 0;//重置为0return;};int main(){int n, m, l ;setiset;set::iterator set_iter;//scanf("%d", &n);//多少组while (n-- > 0){scanf("%d", &m);//每组个数iset.clear();//清空for (int j = 0; j < m; j++){scanf("%d", &l);iset.insert(l);}flag = 0;for (int j = 2; j < m; j++)//加数个数从2到m-1个{for (set_iter = iset.begin(); *set_iter <* iset.rbegin(); set_iter++)//固定的第一个加数{c_sum = *set_iter;tem[0] = c_sum;i = 1;dfs(iset, set_iter, i,j);}}if (flag == 0){printf("Can't find any equations.
");}printf("
");}return 0;}




下面的就不要看了,是第一次写错的结果大哭每次accept都 是历经千辛万苦!!隔了要两个月了吧
========================================================================================================================================================================================================================================================================
WRONG ANSWER

set 作为参数要引用&!

 

注意还原,调试非常好用!

虽然做出来一点意思了,但是不符合要求。。。顺序这个,是要考我们按层次递归么?太蠢了!

但是第一次按自己的意思写出了想要的递归,我舍不得删掉,要留着

t等我写出答案,再来。。。

 

#include "stdafx.h"
#include"stdio.h"
#include"iostream"
#include
using namespace std;
int tem[33] = { 0 };//存放加数 以便输出
int i = 0;
int flag = 0;
void dfs(set &c_iset, set::iterator c_iterator, int de)
{set::iterator set_iter1;for (set_iter1 = c_iterator, set_iter1++; set_iter1 != c_iset.end(); set_iter1++)//set_iter1++,指向下一个{int c_sum = 0;tem[de] = *set_iter1;for (int k = 0; tem[k] != 0; k++){c_sum = c_sum + tem[k];}if (c_iset.find(c_sum) != c_iset.end())//找到sum 成功可输出 {flag = 1;//成功标志printf("%d", tem[0]);for (int j = 1; tem[j] != 0; j++){printf("+%d", tem[j]);}printf("=%d
", c_sum);}if (c_sum >= *c_iset.rbegin())//结束,不必再继续递归下去{tem[de] = 0;//重置为0return;}dfs(c_iset, set_iter1, de + 1);}tem[de] = 0;//重置为0return;
};int main()
{int n, m, l, sum;setiset;set::iterator set_iter;//scanf("%d", &n);while (n-->0){scanf("%d", &m);iset.clear();//清空while (m > 0){scanf("%d", &l);iset.insert(l);m--;}flag = 0;for (set_iter = iset.begin(); set_iter != iset.end(); set_iter++){sum = *set_iter;tem[0] = sum;i = 1;dfs(iset, set_iter, i);}if (flag==0){cout << "Can't find any equations." << endl;}}return 0;
}



 

 

转载于:https://www.cnblogs.com/grandj/p/3762400.html

更多相关:

  • 1. set的初始化 set可以这样初始化 set iset{ 1,2,3 }; set iset2 = { 1,2,3 }; 在初始化set的时候,若出现重复的元素 set iset3{ 1,2,3,3,3 }; set iset4 = { 1,2,3,3,3 };...

  •     Set 对象存储的值总是唯一的 Set 对象方法 方法描述add添加某个值,返回Set对象本身。clear删除所有的键/值对,没有返回值。delete删除某个键,返回true。如果删除失败,返回false。forEach对每个元素执行指定操作。has返回一个布尔值,表示某个键是否在当前 Set 对象之中。 Set 对象...

  • 我现在的vimrc配置文件 runtime! debian.vim "设置编码 set encoding=utf-8 set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 set fileencodings=utf-8,ucs-bom,chinese"语言设置...

  • USE [svnhost]GO/****** 对象:  StoredProcedure [dbo].[up_Page2005]    脚本日期: 05/21/2008 11:27:05 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE proc [dbo].[up_P...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...