【回溯】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