zoukankan      html  css  js  c++  java
  • [POJ1950]Dessert(DFS)

    题目链接:http://poj.org/problem?id=1950

    题意:n个数字中间添加若干个+或-,使得式子运算结果为0。

    枚举位置以及符号即可,注意有可能出现10 11之类的数字,比如这两个数字组合起来会是1011。所以要特别考虑两位数时的组合,即原数*100再加新的数。

    还要默认0 1之间是+,否则会多解。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <cassert>
     8 #include <cstdio>
     9 #include <bitset>
    10 #include <vector>
    11 #include <deque>
    12 #include <queue>
    13 #include <stack>
    14 #include <ctime>
    15 #include <set>
    16 #include <map>
    17 #include <cmath>
    18 using namespace std;
    19 
    20 const int maxn = 16;
    21 int n, tot;
    22 int m;
    23 char tmp[maxn*5];
    24 char opt[maxn*5];
    25 
    26 void dfs(int pos, int pre, int sum) {
    27     if(pos == n) {
    28         if(sum != 0) return;
    29         if(tot < 20) {
    30             for(int i = 1; i < n; i++) printf("%d %c ", i, opt[i]);
    31             printf("%d
    ", n);
    32         }
    33         tot++;
    34         return;
    35     }
    36     opt[pos] = '+'; dfs(pos+1, pos+1, sum+pos+1);
    37     opt[pos] = '-'; dfs(pos+1, pos+1, sum-pos-1);
    38     opt[pos] = '.';
    39     int cur = pos - 1;
    40     while(opt[cur] == '.' && cur >= 0) cur--;
    41     if(pos < 9) {
    42         if(opt[cur] == '+') dfs(pos+1, pre*10+pos+1, sum+(pre*10+pos+1-pre));
    43         else dfs(pos+1, pre*10+pos+1, sum-(pre*10+pos+1-pre));
    44     }
    45     else {
    46         if(opt[cur] == '+') dfs(pos+1, pre*100+pos+1, sum+(pre*100+pos+1-pre));
    47         else dfs(pos+1, pre*100+pos+1, sum-(pre*100+pos+1-pre));
    48     }
    49 }
    50 
    51 int main() {
    52     // freopen("in", "r", stdin);
    53     while(~scanf("%d", &n)) {
    54         tot = 0; m = 0;
    55         memset(tmp, 0, sizeof(tmp));
    56         memset(opt, 0, sizeof(opt));
    57         opt[0] = '+';
    58         dfs(1, 1, 1);
    59         cout << tot << endl;
    60     }
    61     return 0;
    62 }

  • 相关阅读:
    java_day20_Servlet
    前端_day08_定位
    前端_day07_浮动和清除浮动
    前端_day06_CSS选择器
    前端_day05_HTML常见标签
    数据库_day06_多表查询,子查询,事务,sql注入
    java_day19_MVC和配置文件
    chrome更新flash player失败
    jar打包命令使用
    win7开启远程桌面服务
  • 原文地址:https://www.cnblogs.com/kirai/p/6437969.html
Copyright © 2011-2022 走看看