zoj 1204 Additive equations
ACCEPT
//#include "stdafx.h"
#include"stdio.h"
#include"iostream"
#include<set>
using namespace std;
int tem[33] = { 0 };//存放加数 以便输出
int i = 0;
int flag = 0;
int c_sum=0;
void dfs(set<int> &c_iset, set<int>::iterator c_iterator, int de, int num)//num为加数个数
{
set<int>::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\n", 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;//重置为0
return;
}; int main()
{
int n, m, l ;
set<int>iset;
set<int>::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.\n");
}
printf("\n");
}
return 0;
}
set 作为参数要引用&!
注意还原,调试非常好用!
虽然做出来一点意思了,但是不符合要求。。。顺序这个,是要考我们按层次递归么?太蠢了!
但是第一次按自己的意思写出了想要的递归,我舍不得删掉,要留着
t等我写出答案,再来。。。
#include "stdafx.h"
#include"stdio.h"
#include"iostream"
#include<set>
using namespace std;
int tem[33] = { 0 };//存放加数 以便输出
int i = 0;
int flag = 0;
void dfs(set<int> &c_iset, set<int>::iterator c_iterator, int de)
{
set<int>::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\n", c_sum);
}
if (c_sum >= *c_iset.rbegin())//结束,不必再继续递归下去
{
tem[de] = 0;//重置为0
return;
}
dfs(c_iset, set_iter1, de + 1); }
tem[de] = 0;//重置为0
return;
}; int main()
{
int n, m, l, sum;
set<int>iset;
set<int>::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;
}
zoj 1204 Additive equations的更多相关文章
- ZOJ1204——Additive equations(DFS)
Additive equations Description We all understand that an integer set is a collection of distinct int ...
- ZOJ 1204 一个集合能组成多少个等式
Additive equations Time Limit : 20000/10000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other ...
- POJ题目细究
acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP: 1011 NTA 简单题 1013 Great Equipment 简单题 102 ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
- Additive equations--zoj
Additive equations Time Limit: 10 Seconds Memory Limit: 32768 KB We all understand that an inte ...
- ZOJ ACM 1204 (JAVA)
毕业好几年了,对算法还是比較有兴趣,所以想又一次開始做ACM题.俺做题比較任意,一般先挑通过率高的题来做. 第1204题,详细描写叙述请參考,ZOJ ACM 1204 1)难度分析 这个题目,基本的难 ...
- 重拾ZOJ 一周解题
ZOJ 2734 Exchange Cards 题目大意: 给定一个值N,以及一堆卡片,每种卡片有一个值value和数量number.求使用任意张卡片组成N的方式. 例如N = 10 ,cards(1 ...
- ZOJ题目分类
ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
随机推荐
- ZOJ 2182 Cable TV Network(无向图点割-最大流)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2182 题意:给出一个无向图,问最少删掉多少个顶点之后图变得不连通 ...
- VMware ESXI5.0的安装配置 zz
http://www.hotxf.com/thread-297-1-1.html 1, Vmware ESXI 光盘一张文件大小290M,本教程是以 5.0为案例. 2, 所需要安装的操作 ...
- git push 403
1. 在github上新建一个空项目. 2. git clone 到本地仓库. 3. git add [一些文件]. 4. git commit -m "first commit" ...
- [HDOJ5783]Divide the Sequence(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5783 题意:给n个数,要求划分成多个段,使得每一个段的任意前缀和都不小于0. 从后往前截取,这样不会影 ...
- POJ 3461 Oulipo(乌力波)
POJ 3461 Oulipo(乌力波) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] The French autho ...
- plot bar chart using python
Example import matplotlib.pyplot as plt import plotly.plotly as py # Learn about API authentication ...
- Linux基础※※※※如何使用Git in Linux(一)
参考资料: 1. https://www.linux.com/learn/tutorials/796387-beginning-git-and-github-for-linux-users/ 2. h ...
- 简单几步配置gitlab
简单几步配置gitlab 之前配置gitlab需要很多步骤,要装apache2.ruby.tomcat.mysql等一片东西.有没有更简单的方式呢?现在可以借助bitnami,简化了很多. 可以参考v ...
- HDU5886 Tower Defence 【两遍树形dp】【最长链预处理】
题意:N个点的一棵带权树.切掉某条边的价值为切后两树直径中的最大值.求各个边切掉后的价值和(共N-1项). 解法一: 强行两遍dp,思路繁琐,维护东西较多: dis表示以i为根的子树的直径,dis2表 ...
- poj3449Geometric Shapes
链接 繁琐. 处理出来所有的线段,再判断相交. 对于正方形的已知对角顶点求剩余两顶点 (列出4个方程求解) p[].x=(p[].x+p[].x+p[].y-p[].y)/; p[].y=(p[].y ...