Money Systems

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Money Systems相关的知识,希望对你有一定的参考价值。

请考虑一个由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的主要内容,如果未能解决你的问题,请参考以下文章

P2347 砝码称重 & P1474 货币系统 Money Systems

p1474 Money Systems

货币系统 Money Systems

Money Systems

usaco-Money Systems

洛谷P1474 货币系统 Money Systems