【发布时间】:2015-04-06 11:59:31
【问题描述】:
给定一串数字,找出该字符串等于某个目标数字所需的最小加法数。每次添加都相当于在数字字符串的某处插入一个加号。
示例: “1110”
目标 3
将 3 返回为 1+1+1+0=3 需要 3 次加法。
“0123456789”
目标 45
返回:8
“99999”
目标 100
返回:-1
“382834”
100
返回:2
获得 100 的方法有 3 种,分别是 38+28+34、3+8+2+83+4 和 3+82+8+3+4。最低要求是 2。
我试过这个问题,这是我的代码。我第一次考虑一个角色并得到结果。下次我使用 2 个字符并获得结果等等,直到我尝试了所有字符,直到字符串的大小。我没有得到正确的递归。
int min(int a,int b)
{
return a>b?b:a;
}
/* i is current index we are considering and sum is total number
*of + required
*/
int foo(char *a, int size, int i, int current_stock, int target, int sum){
unsigned long long int mini = 1 << 30; /* huge number */
int number=0, mul, m;
int p = i;
if (i+current_stock>size)
return mini;
if (target == 0)
return sum;
if (target < 0)
return mini;
mul = 1;
/* make the multiplier */
for (m=1;m<current_stock;m++) {
mul *= 10;
}
/* make the number from i to current_stock
* if the string is 123 and if i is 0 and current_stock is 2
* then the number will be 12 */
for (m=0;m<current_stock;m++) {
number += (a[p]-'0')*mul;
mul = mul/10;
p++;
}
sum = sum + 1;
for(m=current_stock;m<=size;m++) {
mini = min(mini, foo (a, size, i+current_stock, m, target-number, sum));
}
return mini;
}
int main(void) {
char a[] = "382834";
printf("%d", foo(a, strlen(a), -1, 1, 100, 0));
printf("%d\n", strlen(a));
return 0;
}
【问题讨论】:
标签: algorithm recursion dynamic-programming