欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-01 18:37:23
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

相关标签: # 【回溯】