快速求和
内存限制: 256 MiB 时间限制: 2000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较
题目描述
给定一个数字字符串,用最少次数的加法让字符串等于一个给定的目标数字。每次加法就是在字符串的某个位置插入一个加号。在需要的所有加号都插入后,就象做普通加法那样来求值。 例如,考虑字符串 "12",做 0 次加法,我们得到数字 12。如果插入 1 个加号,我们得到 3。因此,这个例子中,最少用1次加法就得到数字 3。 再举一例,考虑字符串 "303" 和目标数字 6,最佳方法不是 "3+0+3" ,而是 "3+03"。能这样做是因为 1 个数的前导 0 不会改变它的大小。 写一个程序来实现这个算法。
输入格式
第 1 行:1 个字符串 S ( 1 <= length( S ) <= 20 ) 和 1 个整数 N ( N <= 2 ^ 9 - 1)。S 和 N 用空格分隔。
输出格式
第 1 行:1 个整数 K,表示最少的加法次数让 S 等于 N。如果怎么做都不能让 S 等于 N,则输出 -1。
样例
样例输入
复制2222 8
样例输出
复制3
#include <bits/stdc++.h>
using namespace std;
const int N = 2e9 + 5;
int n, len;
int ans = INT_MAX;
string s;
void DFS(int pos, int sum, int cnt, int last) {
if(cnt >= ans || sum > n) {
return;
}
if(pos == len - 1) {
if(sum + last == n) {
ans = cnt;
}
return;
}
DFS(pos + 1, sum + last, cnt + 1, s[pos + 1] - '0');
DFS(pos + 1, sum, cnt, 10 * last + s[pos + 1] - '0');
}
int main() {
cin >> s >> n;
len = s.size();
s += '0';
DFS(0, 0, 0, s[0] - '0');
if(ans == INT_MAX) {
printf("-1");
} else {
printf("%d", ans);
}
return 0;
}