当前位置: 移动技术网 > IT编程>开发语言>Java > 【回溯】C037_LQ_带分数(枚举分割点)

【回溯】C037_LQ_带分数(枚举分割点)

2020年08月01日  | 移动技术网IT编程  | 我要评论
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。还可以表示为:100 = 82 + 3546 / 197。注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)类似这样的带分数,100 有 11 种表示法输入从标准输入读入一个正整数N (N< 1000*1000)输出程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。注意:不要求输出每个表示,只统计有多少表示法!样例输入100 样例输出11

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)
类似这样的带分数,100 有 11 种表示法

输入
从标准输入读入一个正整数N (N< 1000*1000)

输出
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!

样例输入
100  
样例输出
11
方法一:全排列

枚举分割点,可以提前剪枝

#include<bits/stdc++.h>
using namespace std;

const int N=9;
int ans, target, A[N]={1,2,3,4,5,6,7,8,9};

int get_num(int l, int r) {
    int num=0;
    for (int i=l; i<=r; i++) {
        num=num*10+A[i];
    }
    return num;
}
void count() {
    for (int i=0; i<8; i++) {
        int a=get_num(0, i);
        if (a<target)  for (int j=i+1; j<9; j++) {
            int b=get_num(i+1, j), c=get_num(j+1, N-1);
            if (b==c*(target-a)) ans++;
        }
    }
}
void dfs(int i) {
    if (i==N) {
        count();
        return;
    }
    for (int j=i; j<N; j++) {
        swap(A[i], A[j]);
        dfs(i+1);
        swap(A[i], A[j]);
    }
}
int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin >> target;
    dfs(0);
    cout << ans;
    return 0;
}

本文地址:https://blog.csdn.net/qq_43539599/article/details/108158218

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网