首页 > 代码库 > 【USACO 2.3.3】零数列
【USACO 2.3.3】零数列
【题目描述】
请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。 现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。 计算该表达式的结果并判断其值是否为0。 请你写一个程序找出所有产生和为零的长度为N的数列。
【格式】
PROGRAM NAME: zerosum
INPUT FORMAT
单独的一行表示整数N (3 <= N <= 9)。
OUTPUT FORMAT
按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到结果为零的数列。
【分析】
直接DFS,注意累加的时候的公式:
sum-last+last*10+(last的符号)*k(当前数字).
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <cstring> 7 using namespace std; 8 int n; 9 int sgn(int k) {return k>0?1:-1;}//判断符号 10 void dfs(int sum,int last,int k,string rem) 11 {12 if(k==n+1)//边界条件 13 {14 if(sum==0) cout<<rem<<endl;15 return;16 }17 //sum+(last*9+sgn(last)*k)这句意思是 18 dfs(sum+(last*9+sgn(last)*k),last*10+sgn(last)*k,k+1,rem+" "+(char)(k+48));19 dfs(sum+k,k,k+1,rem+"+"+(char)(k+48));20 dfs(sum-k,-k,k+1,rem+"-"+(char)(k+48));21 }22 int main()23 {24 //文件操作25 freopen("zerosum.in","r",stdin);26 freopen("zerosum.out","w",stdout);27 scanf("%d",&n);28 dfs(1,1,2,"1");29 return 0;30 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。