rt 代码:
#include <iostream>
#include <stdint.h>
#include <algorithm>
#include <cstring>
using namespace std;
int const N = 1e5 + 10;
template <typename T>
void read(T &x)
{
int f = 1, ch = getchar();
x = 0;
while(!isdigit(ch))
{
if(ch == '-')f = -f;
ch = getchar();
}
while(isdigit(ch))
{
x = x * 10 + ch - '0';
ch = getchar();
}
return ;
}
template <typename T, typename... Args>
void read(T &x, Args&... args)
{
read(x);
read(args...);
}
int num[45][45];
int n, plu;
bool zero;
string S;
string A;
int l;
bool dfs(int sum, int step, int i,int p)
{
if(p < 0 or sum > n or sum + num[step + 1][l] < n)
return false;
if(step == (int)l)
{
if(sum == n)
{
printf("%d\n", plu);
return true;
}
return false;
}
return dfs(sum - num[i][step] + num[i][step + 1], step + 1, i, p) or dfs(sum + num[step + 1][step + 1], step + 1, step + 1, p - 1);
}
int main()
{
cin >> A;
for(int i = 0;i < (int)A.size();i++) {
if(A[i] != '0')
zero = 1;
if(zero)
S += A[i];
}
read(n);
l = (int)S.length();
for(int i = 1;i <= l; i++)
for(int j = i;j <= l; j++)
{
num[i][j] = num[i][j-1] * 10 + S[j - 1] - '0';
if (num[i][j] > n)
{
while (j <= l) num[i][j++] = 2 * n;
}
}
for(plu = 0;plu < l;plu++)
if(dfs(num[1][1], 1, 1, plu))
return 0;
printf("-1");
return 0;
}