首页 > 其他 > 详细

Money Systems

时间:2016-01-25 20:59:25      阅读:166      评论:0      收藏:0      [点我收藏+]

请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不在第一个数字前插入符号)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。

 

E.X:

1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7

怎么做呢。。
直接模拟
但是怎么写更加优美呢。
膜拜大神代码。简单明了
0_0_0_0_0_0_这样的先把字符串模板摆好后,神奇的dfs一下就OK了。
应为填‘ ’的时候需要把上一个数(正or负)*10再(加or减)当前数字,所以我们需要存储一下last 表示最后一个未加入sum(总和)的数字是多少。

其他的,不懂见代码。
模拟一下就OK。
代码:
/*
ID:Andy Chen
LANG:C++
PROG:zerosum
*/
#include<cstdio>
#include<iostream>
using namespace std;
int N;
char str[20];
void dfs(int k,int sum,int last){
    if(k==N){
        if(sum+last==0) cout<<str<<endl;
        return ;
    }
    str[k*2-1]= ;
    dfs(k+1,sum,last>0?last*10+k+1:last*10-k-1);
    str[k*2-1]=+;
    dfs(k+1,sum+last,k+1);
    str[k*2-1]=-;
    dfs(k+1,sum+last,-k-1);
}
int main()
{
    freopen("zerosum.in","r",stdin);
    freopen("zerosum.out","w",stdout);
    scanf("%d",&N);
    for(int i=0;i<N;++i)
        str[i*2]=char(i+1);
    dfs(1,0,1);
    return 0;
}

 

Money Systems

原文:http://www.cnblogs.com/cherry231/p/5158531.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!