描述
给定1到9的一组输入数字,在这组数字之间添加m个加号,使得分开的数字之和最小;
思想
先确定最后一个加号的位置,则问题分为前面部分的最小数字之和加上最后一个数字;
遍历所有最后一个加号的可能位置,找到最小的结果,即为所求;
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int optimal_add(char a[],int len,int m){
//终止条件,若不加任何加号,则整个数字返回
if(m == 0){
int tmp =0;
for(int i=0;i<len;i++){
tmp = tmp*10 + (a[i]-'0');
}
return tmp;
}
int ret=0;
int tmp;
for(int i=m-1;i<len-1;i++){ //外层循环遍历最后一个加号的所有可能位置
int res_sum = 0; //记录最后一个数字的大小
for(int j=i+1;j<len;j++){ //求最后一个数字的大小
res_sum = res_sum*10+(a[j]-'0');
}
tmp = optimal_add(a,i+1,m-1)+res_sum; //递归,前i+1个数加m-1个加号所得的最小值
//进行一次比较,如果是第一次或者得到的结果比之前的结果小,则存为可能结果
if(ret == 0 || tmp < ret){
ret = tmp;
}
}
return ret;
}
int main(){
char a[10]={0};
cin >> a;
int len = strlen(a);
int m;
cin >> m;
cout << optimal_add(a,len,m);
return 0;
}